Как поймать нажатие клавиши "готово" с мягкой клавиатуры


Как я могу поймать определенные ключевые события с мягкой клавиатуры? в частности, меня интересует ключ "готово".

11 58

11 ответов:

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

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

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

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

Я не совсем уверен, какой слушатель был использован в принятой ответ. Я использовал 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;
        }
    }
});

ответ @ Swato не был полным для меня (и не компилируется!) Итак, я показываю, как сделать сравнение с выполненными и следующими действиями.

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

просто сделайте так:

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

    return false;
}
});
    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;
        }

    }); 

чтобы поймать" готово " нажмите клавишу из метода onKeyUp действия переопределения мягкой клавиатуры. Установка прослушивателя 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;
}

У меня есть EditText, который ищет имена, и он автоматически показывает результаты ниже в ListView. Клавиатура SoftInput показывала только кнопку "Далее" и знак ввода, который ничего не делал. Я хотел только кнопку Done (нет следующего или введите знак), а также я хотел, чтобы он был нажат, он должен закрыть клавиатуру, потому что пользователь должен видеть результаты ниже.

решение, которое я нашел /г-н Сирил Мотье в своем блоге/ было очень простым и работало без какого-либо дополнительного кода: в 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" />

Примечание: inputType упоминание в вашем edittext.

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

вы можете переопределить ключевое событие done следующим образом:

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

IME_MASK_ACTION - 255, в то время как полученный actionId-6, и мой компилятор не принимает

if (actionId & EditorInfo.IME_MASK_ACTION) 

, который является int. В любом случае, какая польза от &-ing 255? Так что тест просто может быть

public boolean onEditorAction(TextView view, int actionId, KeyEvent event) {
    if (actionId == EditorInfo.IME_ACTION_DONE)
    ...
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;
    }
});