Обнаружение события на Android-клавиатуре

У меня есть некоторые намерения внутри контроллера табуляции, и для одного из них у меня есть текст редактирования, который мне нужно знать наверняка, когда он имеет фокус, и когда он теряет этот фокус. Я отобразил большинство событий, таких как прослушиватель фокуса, OnEditorActionListener и т.д. Теперь моя единственная проблема заключается в том, что когда у меня есть фокус, появляется мягкая клавиатура, и я хочу ее закрыть: 1) кнопкой "Готово", а не кнопкой "Назад" на телефоне (отключите кнопку "Назад" , чтобы закрыть клавиатуру, когда клавиатура видна) 2) обнаруживает событие кнопки "Назад" , когда клавиатура видна, поэтому я могу передать фокус другому элементу управления.

Я пробовал несколько способов, но без успеха, например onBackPressed, onConfigurationChanged (добавить hiddenKeyboard в манифесте), key_down на активность и т.д., но без успеха.

Кто-нибудь преуспел в этом? Практически я хочу, когда клавиатура видна, и я нажимаю на телефон, мой текст редактирования теряет фокус (otherControl.requestFocus → , который является относительным расположением).

Ответ 1

Старая тема, но вот ожидаемый ответ

@Override
public boolean onKeyPreIme(int keyCode, KeyEvent event) {
    if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK) {
        Toast.makeText(getContext(), "BACK", Toast.LENGTH_SHORT).show();
        return true;
    }
    return super.onKeyPreIme(keyCode, event);
}

Вы должны поместить это в класс, который переопределяет EditText (класс MyEditText расширяет EditText...)

Ответ 2

Вот способ захвата события нажатия клавиши: 1. Экстентное редактирование текста для переопределения onKeyPreIme

package com.test.test;
import android.content.Context;
import android.util.AttributeSet;
import android.view.KeyEvent;
import android.widget.EditText;

/**
 * Created by sumit.saurabh on 11/10/16.
 */

public class ChatEditText extends EditText
{
    /* Must use this constructor in order for the layout files to instantiate the class properly */
    public ChatEditText(Context context, AttributeSet attrs)
    {
        super(context, attrs);
        // TODO Auto-generated constructor stub
    }

    private KeyImeChange keyImeChangeListener;

    public void setKeyImeChangeListener(KeyImeChange listener)
    {
        keyImeChangeListener = listener;
    }

    public interface KeyImeChange
    {
        public void onKeyIme(int keyCode, KeyEvent event);
    }

    @Override
    public boolean onKeyPreIme(int keyCode, KeyEvent event)
    {
        if (keyImeChangeListener != null)
        {
            keyImeChangeListener.onKeyIme(keyCode, event);
        }
        return false;
    }
}

2. ChatEditText в xml

<com.test.test.ChatEditText
    android:id = "@+id/messageEditText"
    android:layout_width = "match_parent"
    android:layout_height = "wrap_content"
    android:layout_gravity = "bottom"
    android:layout_marginLeft = "12dp"
    android:layout_marginRight = "30dp"
    android:background = "@null"
    android:hint = "Type your message"
    android:inputType = "textMultiLine"
    android:singleLine = "false"
    android:textColorHint = "#c4c0bd"
    android:textSize = "18sp"/>

3. Затем присоедините слушателя из любой точки:

 private ChatEditText messageEditText;
    messageEditText =
       (ChatEditText) findViewById(R.id.messageEditText);
messageEditText.setKeyImeChangeListener(new ChatEditText.KeyImeChange(){
    @Override
    public void onKeyIme(int keyCode, KeyEvent event)
    {
        if (KeyEvent.KEYCODE_BACK == event.getKeyCode())
        {
            // do something
        }
    }});

Ответ 3

здесь

 @Override
public boolean dispatchKeyEvent(KeyEvent event) {
      if(event.getKeyCode() == KeyEvent.KEYCODE_BACK)
     {  //do you back event work here
           }    
    return super.dispatchKeyEvent(event);
}