11

我试图在显示软键盘时捕获“返回”键事件。

我使用的是 SDK ver 8,只有当软键盘被隐藏时才能成功捕获返回键事件,如下所示:

@Override
public void onBackPressed() {
    // do something
    super.onBackPressed();
}

问题是显示软键盘时系统没有调用此方法。我曾尝试登录 onKeyDown/Up() 方法以及上述方法来弄清楚在这种情况下发生了什么,但无济于事。见下文:

@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
    //DEBUGGING
    Log.d(TAG + "KeyUP", String.valueOf(event));
}

按预期返回音量和菜单键的日志,但仅在隐藏软键盘和菜单时才记录返回键。

是否有任何“后退键”大师可以解释这种现象?

任何帮助是极大的赞赏。

4

3 回答 3

14

以下是捕获返回按键事件的方法: 1. 扩展 editText 视图以覆盖 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;
    }
}
  1. xml 中的 ChatEditText

        <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"/>
    
  2. 然后将侦听器 (setKeyImeChangeListener) 附加到编辑文本:

    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
            }
        }});
    
于 2016-10-31T10:16:44.440 回答
8

在本网站和 Android API 上进一步挖掘后,我发现

KeyEvent.KEYCODE_BACK

被具有输入法连接并且当前显示该输入法的 IME 捕获并吞噬(换句话说;软键盘未隐藏)。这意味着该事件在系统调用 Activity 类的 onKeyDown() 或 onKeyUp() 方法之前被消耗。

要解决此问题,请创建 IME 小部件的子类(TextView 或其子类,例如 EditText)并实现onKeyPreIme()

堆栈用户 i2097i 在此处的活动中发布了一个很好的解决方案来实现 onKeyPreIme() 。如果您希望保留 Android 的默认行为(即关闭键盘),请确保在您的 onKeyPreIme() Override 中返回 FALSE。

于 2013-10-30T01:59:51.483 回答
0

通常后退按钮会隐藏键盘(nateve 行为),所以用它做任何事情都不是一个好主意

于 2013-10-28T14:53:44.560 回答