显示软键盘时返回键的Android键事件?

显示软键盘时返回键的Android键事件?,android,android-softkeyboard,Android,Android Softkeyboard,当显示软键盘时,我试图捕捉“后退”键事件 我使用的是SDK版本8,只有在软键盘隐藏时才能成功捕获back key事件,如下所示: @Override public void onBackPressed() { // do something super.onBackPressed(); } 问题是系统在显示软键盘时没有调用此方法。我尝试了登录onKeyDown/Up()方法以及上面的方法,以了解在这种情况下发生了什么,但没有成功。见下文: @Override public bo

当显示软键盘时,我试图捕捉“后退”键事件

我使用的是SDK版本8,只有在软键盘隐藏时才能成功捕获back key事件,如下所示:

@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));
}
按预期返回音量键和菜单键的日志,但只有在软键盘和菜单隐藏时,才会记录后退键

有没有什么“背键”大师可以解释这种现象


非常感谢您的帮助。

通常,后退按钮会隐藏键盘(nateve Behavor),因此在本网站和我发现的Android API上进一步挖掘后,使用它做任何事情都不是一个好主意

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

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

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

以下是捕获返回按键事件的方法: 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;
    }
}
  • 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"/>
    

  • Joan,我同意你的看法,但是在我的例子中,我只想隐藏EditText小部件(如果它是可见的)以及Androids隐藏键盘的默认行为。多次获得回调,这是避免这种情况的更好方法@苏米特
    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
            }
        }});