Используйте клавишу «ENTER» на программной клавиатуре вместо нажатия кнопки - PullRequest
89 голосов
/ 15 декабря 2010

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

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

Ответы [ 7 ]

143 голосов
/ 15 декабря 2010

Вы делаете это, устанавливая 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;
    }
});
38 голосов
/ 19 марта 2014
<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" />

Затем вы можете прослушивать нажатия на кнопку действия, задав для объекта EditText TextView.OnEditorActionListener.В своем слушателе ответьте на соответствующий идентификатор действия 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

25 голосов
/ 15 декабря 2010

может быть, вы можете добавить атрибут к вашему EditText, как это:

android:imeOptions="actionSearch"
5 голосов
/ 24 января 2011

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

, это лучший способ сделать функцию

, а imeOptions также имеет некоторые другие значения, такие как "go"Next «следующий» done «готово» и т. Д.

1 голос
/ 19 декабря 2018

Мы также можем использовать 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 голосов
/ 12 октября 2015

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

 //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 голосов
/ 26 апреля 2013

Чтобы избежать перехода фокуса на следующее редактируемое поле (если оно у вас есть), вы можете игнорировать события нажатия клавиши, но обрабатывать события нажатия клавиши. Я также предпочитаю сначала фильтровать по ключевому коду, предполагая, что он будет немного более эффективным. Кстати, помните, что возвращение 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;
        }
    }

});
...