Використовуйте клавішу “ENTER” на програмній клавіатурі замість того, щоб натискати кнопку


94

Привіт, я шукав EditTextі шукав Button. Коли я набираю текст, який шукається, я б хотів використовувати клавішу ENTER на програмній клавіатурі замість пошуку, Buttonщоб активувати функцію пошуку.

Заздалегідь дякую за допомогу.

Відповіді:


155

Ви робите це, встановивши OnKeyListenerна EditText.

Ось зразок мого власного коду. У мене є EditTextnamed addCourseText, який буде викликати функцію addCourseFromTextBoxпри натисканні клавіші Enter або 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
Насправді це не гарантується для програмних клавіш. Наприклад, це не працює для "ENTER" на Nexus 7 (Android 4.2), а для "BACK".
Гедеон

4
@Ghedeon ви можете встановити android:inputType="text"xml для редагування тексту, щоб він відображав клавішу введення порівняно з клавіатурою за замовчуванням, на якій є повернення каретки.
Нік

2
Цей метод не гарантовано працює як Jellybean, див. Developer.android.com/reference/android/view/KeyEvent.html
Константин

@Ghedeon, як же змусити його працювати для "ENTER" на Nexus 7?
HairOfTheDog

3
Це рішення повністю розбито на багатьох пристроях, включаючи Nexus 7. Не використовуйте його!
user3562927

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

можливо, ви можете додати атрибут до свого редагування тексту так:

android:imeOptions="actionSearch"

1
Це простіше рішення, якщо ви будуєте текст редагування пошуку.
stevyhacker

необхідно встановити , android:inputType="text"а також
li2

6

додати атрибут у EditText, наприклад, android: imeOptions = "actionSearch"

це найкращий спосіб виконати функцію

і imeOptions також мають деякі інші значення, такі як "go" 、 "next" 、 "done" тощо.


2

Також ми можемо використовувати котлінську лямбда

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, припускаючи, що це буде незначно ефективніше. До речі, пам’ятайте, що повернення істини означає, що ви впоралися з подією, тому жоден інший слухач не буде. У всякому разі, ось моя версія.

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"

Потім у вашій діяльності / фрагменті:

EditText.setOnEditorActionListener { _, actionId, _ ->
    if (actionId == EditorInfo.IME_ACTION_SEARCH) {
        // Do what you want here
        return@setOnEditorActionListener true
    }
    return@setOnEditorActionListener false
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.