Используйте клавишу «ENTER» на программной клавиатуре вместо нажатия кнопки

94

Здравствуйте, у меня есть поиск EditTextи поиск Button. Когда я набираю искомый текст, я хотел бы использовать клавишу ENTER на программной клавиатуре вместо поиска, Buttonчтобы активировать функцию поиска.

Заранее спасибо за помощь.

Питер О.
источник

Ответы:

154

Вы делаете это, установив OnKeyListenerна свой EditText.

Вот пример из моего собственного кода. У меня есть EditTextимя addCourseText, которое будет вызывать функцию addCourseFromTextBoxпри нажатии клавиши ввода или d-pad.

addCourseText = (EditText) findViewById(R.id.clEtAddCourse);
addCourseText.setOnKeyListener(new OnKeyListener()
{
    public boolean onKey(View v, int keyCode, KeyEvent event)
    {
        if (event.getAction() == KeyEvent.ACTION_DOWN)
        {
            switch (keyCode)
            {
                case KeyEvent.KEYCODE_DPAD_CENTER:
                case KeyEvent.KEYCODE_ENTER:
                    addCourseFromTextBox();
                    return true;
                default:
                    break;
            }
        }
        return false;
    }
});
Юлиан
источник
4
Собственно, для софт-клавиш это не гарантируется. Например, на Nexus 7 (Android 4.2) не работает клавиша «ВВОД», а на «НАЗАД» - нет.
Ghedeon
4
@Ghedeon вы можете установить android:inputType="text"xml для текста редактирования, чтобы отображать клавишу ввода по сравнению с клавиатурой по умолчанию, которая имеет возврат каретки.
Ник
2
Работа этого метода не гарантируется, начиная с Jellybean, см. Developer.android.com/reference/android/view/KeyEvent.html
Константин
@Ghedeon, так как же заставить его работать для "ENTER" на Nexus 7?
HairOfTheDog
3
Это решение полностью не работает на многих устройствах, включая Nexus 7. Не используйте это!
Stevey
44
<EditText
    android:id="@+id/search"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:hint="@string/search_hint"
    android:inputType="text"
    android:imeOptions="actionSend" />

Затем вы можете прослушивать нажатия кнопки действия, определив TextView.OnEditorActionListener для элемента EditText. В прослушивателе ответьте на соответствующий идентификатор действия IME, определенный в классе EditorInfo, например IME_ACTION_SEND. Например:

EditText editText = (EditText) findViewById(R.id.search);
editText.setOnEditorActionListener(new OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        boolean handled = false;
        if (actionId == EditorInfo.IME_ACTION_SEND) {
            sendMessage();
            handled = true;
        }
        return handled;
    }
});

Источник: https://developer.android.com/training/keyboard-input/style.html

Андрей Ковальчук
источник
26

может быть, вы могли бы добавить атрибут в свой EditText следующим образом:

android:imeOptions="actionSearch"
itemon
источник
1
Это более простое решение, если вы создаете текст для редактирования поиска.
stevyhacker
android:inputType="text"тоже нужно установить
li2
6

добавьте атрибут в EditText, например android: imeOptions = "actionSearch"

это лучший способ выполнить функцию

и imeOptions также имеют некоторые другие значения, такие как "go" 、 "next" 、 "done" и т. д.

ruyi.zhu
источник
2

Мы также можем использовать лямбда Kotlin

editText.setOnKeyListener { _, keyCode, keyEvent ->
        if (keyEvent.action == KeyEvent.ACTION_DOWN && keyCode == KeyEvent.KEYCODE_ENTER) {
            Log.d("Android view component", "Enter button was pressed")
            return@setOnKeyListener true
        }
        return@setOnKeyListener false
    }
Артем Ботнев
источник
0

Чтобы избежать перехода фокуса к следующему редактируемому полю (если оно у вас есть), вы можете игнорировать события нажатия клавиши, но обрабатывать события нажатия клавиши. Я также предпочитаю сначала фильтровать по keyCode, предполагая, что это будет немного эффективнее. Кстати, помните, что возвращение true означает, что вы обработали событие, поэтому никакой другой слушатель этого не сделает. Во всяком случае, вот моя версия.

ETFind.setOnKeyListener(new OnKeyListener()
{
    public boolean onKey(View v, int keyCode, KeyEvent event)
    {
        if (keyCode ==  KeyEvent.KEYCODE_DPAD_CENTER
        || keyCode ==  KeyEvent.KEYCODE_ENTER) {

            if (event.getAction() == KeyEvent.ACTION_DOWN) {
                // do nothing yet
            } else if (event.getAction() == KeyEvent.ACTION_UP) {
                        findForward();      
            } // is there any other option here?...

            // Regardless of what we did above,
            // we do not want to propagate the Enter key up
            // since it was our task to handle it.
            return true;

        } else {
            // it is not an Enter key - let others handle the event
            return false;
        }
    }

});
Войтек Ярош
источник
0

это образец одного из моих приложений, как я обрабатываю

 //searching for the Edit Text in the view    
    final EditText myEditText =(EditText)view.findViewById(R.id.myEditText);
        myEditText.setOnKeyListener(new View.OnKeyListener() {
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                 if (event.getAction() == KeyEvent.ACTION_DOWN)
                      if ((keyCode == KeyEvent.KEYCODE_DPAD_CENTER) ||
                             (keyCode == KeyEvent.KEYCODE_ENTER)) {
                                //do something
                                //true because you handle the event
                                return true;
                               }
                       return false;
                       }
        });
Алехандро Серрет
источник
0

Самый современный способ добиться этого:

Добавьте это в свой EditText в XML:

android:imeOptions="actionSearch"

Затем в вашем Activity / Fragment:

EditText.setOnEditorActionListener { _, actionId, _ ->
    if (actionId == EditorInfo.IME_ACTION_SEARCH) {
        // Do what you want here
        return@setOnEditorActionListener true
    }
    return@setOnEditorActionListener false
}
Хасан ТБТ
источник