Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

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

Найти docs здесь.

Ответ 2

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

Ответ 3

Ответ @Swato был неполным для меня (и не компилируется!), поэтому я показываю, как сделать сравнение с действиями 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

Ответ 4

просто выполните следующие действия:

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

    return false;
}
});

Ответ 5

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

    }); 

Ответ 6

Чтобы уловить нажатие клавиши "Готово" с помощью мягкой клавиатуры, переопределите метод Activity 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;
}

Ответ 7

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

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

Ответ 8

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

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

Ответ 9

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

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

Ответ 10

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)
    ...

Ответ 11

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