无法在模拟器中检测到软键盘的删除按钮
Unable to detect delete button of soft keyboard in emulator
我正在尝试使用以下方法检测软键盘的后退或删除按钮。它在物理设备中运行良好,但无法运行 emulator
。模拟器能够检测除删除按钮之外的所有按键事件(如输入按钮、数字按钮)。在模拟器中按下删除按钮时,onKeyDown()
和 dispatchKeyEvent()
都不会被调用。可能是什么问题?
这样做的目的:
如果用户在当前空的 EditText
字段上按删除键,我将尝试导航到之前的 EditText
字段。这就是我依赖 dispatchKeyEvent()
方法的原因。
我正在使用 Nexus 5X API 25 模拟器
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_DEL) {
Log.e(TAG,keyCode)
}
return super.onKeyDown(keyCode, event);
}
这是我的布局:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:focusable="true"
android:hint="Name" />
</RelativeLayout>
删除按钮的图片:
了解您的要求后,我发现 onKeyDown
和 onKeyUp
无法在 Nexus 5 API 25
模拟器上运行,但如果您真的想使用 Nexus 5 API 25
,TextWatcher 可以满足您的目的模拟器。
在 Nexus 5X API 26
上,onKeyDown
和 onKeyUp
工作正常。当然 TextWatcher
也在工作。
使用TextWatcher检测EditText中文本的变化,在那里你可以检查按下了哪个键。以下是工作代码:
TextWatcher textWatcher = new TextWatcher() {
public void beforeTextChanged(CharSequence s, int start, int count, int after){
if (after < count) {
Log.d("DELETE_KEY_PRESSED", "beforeTextChanged: ");
}
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (s.length()>0 && s.subSequence(s.length()-1, s.length()).toString().equalsIgnoreCase("\n")) {
Log.d("ENTER_KEY_PRESSED", "onTextChanged: ");
} else if (s.length() == 0) {
Log.d("DELETE_KEY_PRESSED", "onTextChanged: ");
}
}
@Override
public void afterTextChanged(Editable s) {
}
};
EditText editText = (EditText) findViewById(R.id.edit);
editText.addTextChangedListener(textWatcher);
您也可以使用 TextWatcher 检测所有其他按下的键。
顺便说一句,对我来说 onKeyDown() and onKeyUp() 在模拟器上也能正常工作。我正在使用以下代码:
//To detect DELETE KEY PRESS event there is no text in EditText
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_DEL) {
Log.d("KEY_PRESSED - onKeyDown", "KEYCODE_DEL");
}
return super.onKeyDown(keyCode, event);
}
//To detect DELETE KEY PRESS event there is no text in EditText
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_DEL) {
Log.d("KEY_PRESSED - onKeyUp", "KEYCODE_DEL");
}
return super.onKeyUp(keyCode, event);
}
注意:我使用的是 Nexus 5X API 26 模拟器
我正在尝试使用以下方法检测软键盘的后退或删除按钮。它在物理设备中运行良好,但无法运行 emulator
。模拟器能够检测除删除按钮之外的所有按键事件(如输入按钮、数字按钮)。在模拟器中按下删除按钮时,onKeyDown()
和 dispatchKeyEvent()
都不会被调用。可能是什么问题?
这样做的目的:
如果用户在当前空的 EditText
字段上按删除键,我将尝试导航到之前的 EditText
字段。这就是我依赖 dispatchKeyEvent()
方法的原因。
我正在使用 Nexus 5X API 25 模拟器
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_DEL) {
Log.e(TAG,keyCode)
}
return super.onKeyDown(keyCode, event);
}
这是我的布局:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:focusable="true"
android:hint="Name" />
</RelativeLayout>
删除按钮的图片:
了解您的要求后,我发现 onKeyDown
和 onKeyUp
无法在 Nexus 5 API 25
模拟器上运行,但如果您真的想使用 Nexus 5 API 25
,TextWatcher 可以满足您的目的模拟器。
在 Nexus 5X API 26
上,onKeyDown
和 onKeyUp
工作正常。当然 TextWatcher
也在工作。
使用TextWatcher检测EditText中文本的变化,在那里你可以检查按下了哪个键。以下是工作代码:
TextWatcher textWatcher = new TextWatcher() {
public void beforeTextChanged(CharSequence s, int start, int count, int after){
if (after < count) {
Log.d("DELETE_KEY_PRESSED", "beforeTextChanged: ");
}
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (s.length()>0 && s.subSequence(s.length()-1, s.length()).toString().equalsIgnoreCase("\n")) {
Log.d("ENTER_KEY_PRESSED", "onTextChanged: ");
} else if (s.length() == 0) {
Log.d("DELETE_KEY_PRESSED", "onTextChanged: ");
}
}
@Override
public void afterTextChanged(Editable s) {
}
};
EditText editText = (EditText) findViewById(R.id.edit);
editText.addTextChangedListener(textWatcher);
您也可以使用 TextWatcher 检测所有其他按下的键。
顺便说一句,对我来说 onKeyDown() and onKeyUp() 在模拟器上也能正常工作。我正在使用以下代码:
//To detect DELETE KEY PRESS event there is no text in EditText
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_DEL) {
Log.d("KEY_PRESSED - onKeyDown", "KEYCODE_DEL");
}
return super.onKeyDown(keyCode, event);
}
//To detect DELETE KEY PRESS event there is no text in EditText
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_DEL) {
Log.d("KEY_PRESSED - onKeyUp", "KEYCODE_DEL");
}
return super.onKeyUp(keyCode, event);
}
注意:我使用的是 Nexus 5X API 26 模拟器