ListView 在重新加载后从 EditText 窃取焦点
ListView stealing focus form EditText after reload
所以我在它下面有一个 EditText
和一个 ListView
。我正在监听要按下的 KEYCODE_ENTER
,之后,我将一个条目添加到列表视图的适配器并调用 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;
}
});
问题显然与列表视图重新加载有关,因为当我注释掉行 adapter.notifyDataSetChanged();
时,焦点仍在 EditText
.
重载 ListView
后,有什么方法可以让焦点保持在 EditText
上吗?
P.S。重新加载数据后,我尝试在 editText 上调用 requestFocus()
无济于事。
试试这个
mTextEdit.setFocusableInTouchMode(true);
mTextEdit.requestFocus();
如果你也想用软键盘获得焦点。在上面的代码之后写下面的代码
final InputMethodManager inputMethodManager = (InputMethodManager) context
.getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.showSoftInput(mTextEdit, InputMethodManager.SHOW_IMPLICIT);
试试这个,
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;
}
});
所以我在它下面有一个 EditText
和一个 ListView
。我正在监听要按下的 KEYCODE_ENTER
,之后,我将一个条目添加到列表视图的适配器并调用 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;
}
});
问题显然与列表视图重新加载有关,因为当我注释掉行 adapter.notifyDataSetChanged();
时,焦点仍在 EditText
.
重载 ListView
后,有什么方法可以让焦点保持在 EditText
上吗?
P.S。重新加载数据后,我尝试在 editText 上调用 requestFocus()
无济于事。
试试这个
mTextEdit.setFocusableInTouchMode(true);
mTextEdit.requestFocus();
如果你也想用软键盘获得焦点。在上面的代码之后写下面的代码
final InputMethodManager inputMethodManager = (InputMethodManager) context
.getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.showSoftInput(mTextEdit, InputMethodManager.SHOW_IMPLICIT);
试试这个,
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;
}
});