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