所以我有一个EditText
和一个ListView
。我正在监听KEYCODE_ENTER
被按下,之后,我在listview的适配器中添加了一个条目并调用了notifyDataSetChanged()
方法。令人惊讶的是,在此之后,列表视图中的第一个项目变得专注而不是之前关注的EditText
。
这是我的布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<EditText
android:id="@+id/edit_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:imeOptions="actionSearch"
android:singleLine="true"/>
<ListView
android:id="@+id/list_view"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
这是按下回车键时的操作
mTextEdit.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if ((event.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER)) {
// modifying data set
onScanDataReceived(mTextEdit.getText().toString().trim());
BaseAdapter adapter = (BaseAdapter) mListView.getAdapter();
adapter.notifyDataSetChanged();
mTextEdit.setText(null);
return true;
}
return false;
}
});
问题很明显在于listview重新加载,因为当我注释掉adapter.notifyDataSetChanged();
行时,焦点仍在EditText
上。
重新加载EditText
后,是否有任何方法可以将注意力集中在ListView
上?
P.S。我在重新加载数据后无法使用editText调用requestFocus()
。
答案 0 :(得分:0)
试试这个
mTextEdit.setFocusableInTouchMode(true);
mTextEdit.requestFocus();
如果你想要与软键盘一起使用。在上面的代码
之后写下面的代码final InputMethodManager inputMethodManager = (InputMethodManager) context
.getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.showSoftInput(mTextEdit, InputMethodManager.SHOW_IMPLICIT);
答案 1 :(得分:0)
试试这个,
mTextEdit.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if ((event.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER)) {
// modifying data set
onScanDataReceived(mTextEdit.getText().toString().trim());
BaseAdapter adapter = (BaseAdapter) mListView.getAdapter();
adapter.notifyDataSetChanged();
mTextEdit.setText(null);
Handler mHandler = new Handler();
mHandler.postDelayed(
new Runnable() {
@Override
public void run() {
mTextEdit.requestFocus();
}
}
, 50 // 50...for delay in my case
);
return true;
}
return false;
}
});