我有一些适用于EditText字段的代码,但是当我更改焦点时(根据需要更改焦点)会记录此错误:
InputEventConsistencyVerifier KeyEvent: ACTION_UP but key was not down
有人可以解释为什么吗?
我阅读了产生此错误的InputEventConsistencyVerifier源,但我不知道它是如何发生的。我尝试删除list.requestFocus()。但是如果没有这一行,焦点将停留在EditText字段上。但是,删除该行不会消除日志中的错误。
public class AddDeleteActivity extends FragmentActivity {
private final String TAG = "AddDeleteName";
/*
* (non-Javadoc)
*
* @see android.app.Activity#onCreate(android.os.Bundle)
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
Log.e(TAG, "about to load fragment");
setContentView(R.layout.add_delete_child_layout);
Log.e(TAG, "finished loading fragment");
final EditText nameTextField = (EditText) findViewById(R.id.new_child);
nameTextField
.setOnEditorActionListener(new OnEditorActionListener() {
@Override
˚ public boolean onEditorAction(TextView v, int actionId,
KeyEvent event) {
Log.e(TAG, "onEditorAction: " + actionId);
String name = nameTextField.getText()
.toString();
Log.e(TAG, " name: " + name);
InputMethodManager inputManager = (InputMethodManager) v
.getContext().getSystemService(
Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(
v.getWindowToken(), 0);
Log.e(TAG, "change focus to List");
View list = findViewById(R.id.modchild_fragment);
/*** FOLLOWING LINE GENERATES ERROR *****/
list.requestFocus();
return false;
}
});
}
}
.xml:
<fragment
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/modchild_fragment"
android:name="com.projectx.control.AddDeleteChild"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
</fragment>
<EditText
android:id="@+id/new_child"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="enter launch codes"
android:imeOptions="actionDone"
android:inputType="text"
android:singleLine="true" />
谢谢!
最佳答案
首先,您可能不想使用list.requestFocus
,而是使用nameTextField.clearFocus
,因为它可以更准确地传达您要执行的操作。
现在,我不知道该特定错误的所有详细信息,但是我猜测是TextView在处理onEditorAction
或ACTION_DOWN
事件消息的过程中同步调用ACTION_UP
。然后在其他地方调用requestFocus
可能会破坏按键的正常事件流。再次,这只是一个猜测。
您可以做的是将list.requestFocus
调用包装在Runnable
中,然后使用Handler.post(Runnable)
将可运行的消息发布到事件循环中。一种常见的模式是在UI类中保留一个包含Handler的私有字段(例如,片段或活动),例如:
Handler mHandler = new Handler();
...
mHandler.post(...);
这将使当前事件/消息完成处理,并且仅执行Runnable(在这种情况下,在处理了所有其他当前已发布的消息之后(通常只有几毫秒)调用
list.requestFocus
。正如我上面所说,尝试使用
clearFocus
代替。关于android - RequestFocus错误:KeyEvent:ACTION_UP,但是键没有按下,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12607820/