Как поймать нажатие клавиши «Готово» с программной клавиатуры - PullRequest
60 голосов
/ 13 июня 2010

как мне перехватить определенные события клавиш с помощью программной клавиатуры? особенно меня интересует клавиша "Готово".

Ответы [ 11 ]

58 голосов
/ 09 января 2012

Я не совсем уверен, какой тип слушателя использовался в принятом ответе.Я использовал OnKeyListener, прикрепленный к EditText, и он не смог поймать следующий или не выполненный.

Однако использование OnEditorActionListener сработало, и это также позволило мне различать их, сравнивая действиезначение с определенными константами EditorInfo.IME_ACTION_NEXT и EditorInfo.IME_ACTION_DONE.

editText.setOnEditorActionListener(new OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        if ((actionId & EditorInfo.IME_MASK_ACTION) != 0) {
            doSomething();
            return true;
        }
        else {
            return false;
        }
    }
});
38 голосов
/ 11 октября 2013

@ Ответ Свато не был для меня полным (и не компилируется!), Поэтому я показываю, как выполнить сравнение с действиями DONE и NEXT.

editText.setOnEditorActionListener(new OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView view, int actionId, KeyEvent event) {
        int result = actionId & EditorInfo.IME_MASK_ACTION;
        switch(result) {
        case EditorInfo.IME_ACTION_DONE:
            // done stuff
            break;
        case EditorInfo.IME_ACTION_NEXT:
            // next stuff
            break;
        }
    }
});

Также хочу отметить, что для JellyBean и выше OnEditorActionListener необходим для прослушивания 'enter' или 'next', и вы не можете использовать OnKeyListener. Из документов:

Поскольку методы мягкого ввода могут использовать несколько изобретательных способов ввода текста, нет гарантии, что любое нажатие клавиши на программной клавиатуре вызовет событие клавиши: это остается на усмотрение IME, а фактически отправляет такие события не приветствуются . Вы никогда не должны полагаться на получение KeyEvents для любой клавиши на программном методе ввода.

Ссылка: http://developer.android.com/reference/android/view/KeyEvent.html

29 голосов
/ 13 июня 2010

Примечание: Этот ответ старый и больше не работает. Смотрите ответы ниже.

Вы ловите KeyEvent и затем проверяете его код ключа. FLAG_EDITOR_ACTION используется для идентификации ключей ввода, которые поступают из IME, чей ключ ввода был автоматически помечен как «следующий» или «выполнено»

if (event.getKeyCode() == KeyEvent.FLAG_EDITOR_ACTION)
    //your code here

Найдите документы здесь .

10 голосов
/ 28 марта 2015

просто так:

editText.setOnEditorActionListener(new OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView view, int actionId, KeyEvent event) {
    if(actionId == EditorInfo.IME_ACTION_DONE)
    {
       //Do Something
    }

    return false;
}
});
8 голосов
/ 20 марта 2012
    etSearchFriends = (EditText) findViewById(R.id.etSearchConn);
    etSearchFriends.setOnKeyListener(new OnKeyListener() {
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            // If the event is a key-down event on the "enter" button
            if ((event.getAction() == KeyEvent.ACTION_DOWN) &&
                (keyCode == KeyEvent.KEYCODE_ENTER)) {
                Toast.makeText(ACTIVITY_NAME.this, etSearchFriends.getText(),Toast.LENGTH_SHORT).show();
              return true;
            }
            return false;
        }

    }); 
2 голосов
/ 31 июля 2014

Чтобы поймать клавишу «Готово», нажмите программную клавиатуру, чтобы переопределить метод onKeyUp в Activity.Установка прослушивателя OnKeyListener для представления не будет работать, потому что нажатия клавиш в методах программного ввода обычно не вызывают методы этого прослушивателя, этот обратный вызов вызывается при нажатии аппаратной клавиши в представлении.

// Called when a key was released and not handled by any of the views inside of the activity. 
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
    switch (keyCode) {
        case KeyEvent.KEYCODE_ENTER:
            // code here
            break;
        default:
            return super.onKeyUp(keyCode, event);
    }
    return true;
}
1 голос
/ 22 сентября 2016

вы можете переопределить событие готового ключа этим методом:

editText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        if (actionId == EditorInfo.IME_ACTION_DONE) {
            // do your stuff here
        }
        return false;
    }
});
1 голос
/ 19 марта 2015

Примечание: тип ввода упоминается в вашем тексте редактирования.

<EditText android:id="@+id/select_category" 
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="text" >

edittext.setOnEditorActionListener(new OnEditorActionListener() {

            @Override
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {

                if ((actionId & EditorInfo.IME_MASK_ACTION) == EditorInfo.IME_ACTION_DONE) {
                    //do something here.
                    return true;
                }
                return false;
            }
        });
1 голос
/ 09 июля 2014

У меня есть EditText, который ищет имена, и он автоматически показывает результаты ниже в ListView.Клавиатура SoftInput показала только кнопку «Далее» и знак «Ввод», но ничего не произошло.Мне нужна была только кнопка «Готово» (без знака «Далее» или «Ввод»), а также когда она была нажата, она должна закрывать клавиатуру, потому что пользователь должен видеть результаты под ней.

Решение, которое я нашел / от Mr Cyril Mottierего блог / был очень простым и работал без какого-либо дополнительного кода: в xml, где находится EditText, это должно быть написано: android: imeOptions = "actionDone"

, чтобы скрыть клавиатуру кнопкой Done, EditText должен выглядетьэто:

<EditText
        android:id="@+id/editText1central"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/imageView1"
        android:layout_toLeftOf="@+id/imageView2tie"
        android:ems="10"
        android:imeOptions="actionDone"
        android:hint="@string/trazi"
        android:inputType="textPersonName" />
0 голосов
/ 16 октября 2017
editText = (EditText) findViewById(R.id.edit_text);

editText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        if (actionId == EditorInfo.IME_ACTION_DONE) {
            // code here
        }
        return false;
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...