Используйте клавишу" ENTER " на softkeyboard вместо нажатия кнопки

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

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

6 ответов


Вы делаете это путем установки OnKeyListener на EditText.

вот пример из моего собственного кода. У меня есть EditText имени 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;
    }
});

<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


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

android:imeOptions="actionSearch"

добавить атрибут в EditText как android: imeOptions= "actionSearch"

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

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


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

});

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

 //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;
                       }
        });