我正在尝试在显示软键盘时捕获“后退”键事件。
我正在使用SDK ver 8,并且只有在软键盘为HIDDEN时才能成功捕获后退键事件,如下所示:
@Override
public void onBackPressed() {
// do something
super.onBackPressed();
}
问题是系统在显示软键盘时没有调用此方法。我试图登录KeyDown / Up()方法以及上面的方法来解决这个场景中发生的事情无济于事。见下文:
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
//DEBUGGING
Log.d(TAG + "KeyUP", String.valueOf(event));
}
按预期返回音量和菜单键的日志,但仅在隐藏软键盘和菜单时才会记录后退键。
是否有任何可以解释这种现象的“背键”大师?
非常感谢任何帮助。
答案 0 :(得分:11)
以下是捕获按键事件的方法: 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中的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"/>
然后将一个监听器(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
}
}});
答案 1 :(得分:6)
在此网站和Android API上进一步挖掘后,我发现了
KeyEvent.KEYCODE_BACK
被具有输入法连接的IME捕获并吞噬,并且当前显示该输入方法(换句话说,软键盘未被隐藏)。这意味着在系统调用Activity类onKeyDown()或onKeyUp()方法之前消耗该事件。
要解决此问题,请创建IME小部件的子类(TextView或其子类,如EditText)并实现onKeyPreIme()。
Stack user i2097i发布了一个很好的解决方案,可以在活动here中实现onKeyPreIme()。 如果您希望保留Androids默认行为(即关闭键盘),请确保在onKeyPreIme()覆盖中返回FALSE。
答案 2 :(得分:0)
通常后退按钮会隐藏键盘(原生行为),所以不要用它做任何事情