Неявне «Надіслати» після натискання кнопки «Готово» на клавіатурі в останньому EditText


96

Я використовував деякі програми, коли під час заповнення свого імені користувача перейдіть до свого пароля, якщо я натиснув "Готово" на клавіатурі, форма входу автоматично подається, без мене потрібно натискати кнопку "Надіслати". Як це робиться?



Швидке посилання на документи: Вкажіть метод введення Дія
FirstOne

Відповіді:


185

Спробуйте це:

У своєму макеті поставте / відредагуйте це:

<EditText
    android:id="@+id/search_edit"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:inputType="text"
    android:singleLine="true"
    android:imeOptions="actionDone" />

У своїй діяльності введіть це (наприклад, в onCreate):

 // your text box
 EditText edit_txt = (EditText) findViewById(R.id.search_edit);

 edit_txt.setOnEditorActionListener(new EditText.OnEditorActionListener() {
     @Override
     public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
         if (actionId == EditorInfo.IME_ACTION_DONE) {
             submit_btn.performClick();
             return true;
         }
         return false;
     }
 });

Де submit_btnзнаходиться ваша кнопка надсилання із прикріпленим обробником onclick.


15
submit_btn.performClick();пече мої очі. Srsly? Чому б не зателефонувати за способом подання?
Лоран Мейєр

28
@LaurentMeyer Моделювання вводу користувача зазвичай краще, ніж безпосередньо виклик основної логіки в цих ситуаціях. Наприклад, на даний момент кнопка надсилання може бути відключена, тож performClick () нічого не зробить (як задумано), але якщо ви викликали метод подання безпосередньо, вам доведеться перевірити, чи не була кнопка відключена спочатку. Він також відтворить звук "клацання" так, ніби кнопку натиснуто і т. Д.
Екстрагорей,

3
@LaurentMeyer Що ви розумієте під інтерфейсом користувача? І 5 людей за останні 6 місяців, звичайно. Дайте їм час, і люди, напевно, погодиться і зі мною. ;)
Екстрагорій

Розглянемо, що ви змінюєте інтерфейс користувача, який використовує кнопку для чогось іншого. Код буде справжнім безладом, і що ще гірше, вам потрібно мати справді обширні процедури тестування, щоб виявити подібну помилку. Ще гірше - коли ти поділишся компонент інтерфейсу з такими практиками.
Лоран Мейер,

1
TWIMC, використовуючи imeActionLabelв моєму редакторі EditText, відключав всю цю поведінку. Будьте
уважні

25

Вам потрібно встановити параметри IME на вашому EditText.

<EditText
    android:id="@+id/some_view"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:hint="Whatever"
    android:inputType="text"
    android:imeOptions="actionDone" />

Потім додайте OnEditorActionListenerдо перегляду, щоб прослухати виконану дію.

EditText editText = (EditText) findViewById(R.id.some_view);
editText.setOnEditorActionListener(new OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        boolean handled = false;
        if (actionId == EditorInfo.IME_ACTION_DONE) {
            // TODO do something
            handled = true;
        }
        return handled;
    }
});

Офіційний документ API: https://developer.android.com/guide/topics/ui/controls/text.html#ActionEvent


22

Просте та ефективне рішення з Котліном

Розширити EditText:

fun EditText.onSubmit(func: () -> Unit) {
    setOnEditorActionListener { _, actionId, _ ->

       if (actionId == EditorInfo.IME_ACTION_DONE) {
           func()
       }

       true

    }
}

Тоді скористайтеся таким методом:

editText.onSubmit { submit() }

Де submit()щось подібне:

fun submit() {
    // call to api
}

Більш загальне розширення

fun EditText.on(actionId: Int, func: () -> Unit) {
    setOnEditorActionListener { _, receivedActionId, _ ->

       if (actionId == receivedActionId) {
           func()
       }

        true
    }
}

А потім ви можете використовувати його для прослуховування своєї події:

email.on(EditorInfo.IME_ACTION_NEXT, { confirm() })

6

Ось як це робиться

editText.setOnEditorActionListener(new OnEditorActionListener() {        
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        if(actionId==EditorInfo.IME_ACTION_DONE){
            //do something
        }
    return false;
    }
});

Не забудьте додати

<EditText android:layout_height="wrap_content"

android:layout_width="wrap_content"

android:imeOptions="actionDone"/>

actionDone у вашому EditText.


2

До вашого XML-файлу всередині тегу edittext додайте фрагмент нижче

android:imeOptions="actionDone"

Потім всередині свого класу Java напишіть код нижче

editText.setOnEditorActionListener(new EditText.OnEditorActionListener() { 


@Override 
  public boolean onEditorAction(TextView v, int id, KeyEvent event) { 
   if (id == EditorInfo.IME_ACTION_DONE) { 
      //do your work here 
      return true;
    } 

        return false; 
   } 
  });


1
etParola = (EditText) findViewById(R.id.etParola); 
 btnGiris = (Button) findViewById(R.id.btnGiris);
  etParola.setOnEditorActionListener(new EditText.OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                if (actionId == EditorInfo.IME_ACTION_DONE) {
                    btnGiris.performClick();
                    return true;
                }
                return false;
            }
        });

 and;


layout xml etParola
android:imeOptions="actionDone" add

Це точно така сама відповідь, як і ця . Вам слід трохи пояснити, як ви вважаєте, що це вирішує проблему OP.
Адріан Ш

1

Просто розширіть цю відповідь

fun EditText.onSubmit(func: () -> Unit) {
    setOnEditorActionListener { _, actionId, _ ->
        if (actionId == EditorInfo.IME_ACTION_DONE) {
            clearFocus() // if needed 
            hideKeyboard()
            func()
        }
        true
    }
}

fun EditText.hideKeyboard() {
    val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    imm.hideSoftInputFromWindow(this.windowToken, 0)
}

0
<EditText
        android:id="@+id/signinscr_userName"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:hint="@string/userName"
        android:imeOptions="actionNext" />

    <EditText
        android:id="@+id/signinscr_password"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:hint="@string/password"
        android:imeOptions="actionDone"
        android:inputType="textPassword" />

у файлі .java

EditText userNameField = (EditText) findViewById(R.id.signinscr_userName);
    EditText passwordField = (EditText) findViewById(R.id.signinscr_password);
    passwordField.setOnEditorActionListener(new OnEditorActionListener() {
        public boolean onEditorAction(TextView arg0, int arg1, KeyEvent arg2) {
            //Do your operation here.
            return false;
        }
    });

0
 EditText edit_txt = (EditText) findViewById(R.id.search_edit);

 edit_txt.setOnEditorActionListener(new EditText.OnEditorActionListener() {
     @Override
     public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
// which is u had set a imeoption
         if (actionId == EditorInfo.IME_ACTION_DONE) {
             submit_btn.performClick();
             return true;
         }
         return false;
     }
 });
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.