我正在使用SearchView
. 可以触摸放大镜,显示其编辑框,用户可以输入文本来过滤列表的内容。它几乎可以工作。但是,当用户按下向上按钮时,折叠回到图标,小部件内的文本被清除,过滤被重置。效果(在我的情况下)是只有在未图标化时才能过滤列表。想要的行为是在折叠后也保留过滤器文本。ActionBar
ListView
SearchView
SearchView
SearchView
SearchView
注意:该行为可能在 Android 4.3 中发生了变化。使用 4.2.2 它可以按需要工作。请参阅下面的观察结果。
详细信息:更具体地说,菜单包含以下项目:
<item android:id="@+id/menu_search_customers"
android:title="@string/menu_search_text"
android:icon="@android:drawable/ic_menu_search"
android:showAsAction="ifRoom|collapseActionView"
android:actionViewClass="android.widget.SearchView" />
注意图标和android:showAsAction
。我相信Up按钮在展开时默认出现SearchView
(Up我的意思是加号图标 - 请参阅来自官方Navigation with Back and Up<
的蓝皮书的右图)。似乎默认处理程序实现只是折叠展开(返回到图标状态)。SearchView
调试时,我发现使用UponQueryTextChange()
时会以空文本触发。(我相信 Android 4.2.2 不是这种情况,因为它在操作系统更新之前可以正常工作。)这就是列表项的过滤也被重置的原因——见下文。我想要折叠的,过滤器文本在操作栏中显示为副标题。onQueryTextChange()
SearchView
到目前为止,我的相关代码SearchView
如下所示:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// MenuInflater adds the magnifying glass icon for the SearchView
// to the ActionBar as the always visible menu item.
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.customers_menu, menu);
// Get the related SearchView widget.
SearchView sv = (SearchView) menu.findItem(R.id.menu_search_customers)
.getActionView();
// Get the changes immediately.
sv.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
// I am not sure whether the onQueryTextSubmit() is important
// for the purpose.
@Override
public boolean onQueryTextSubmit(String query) {
getActionBar().setSubtitle(mCurFilter);
return true;
}
@Override
public boolean onQueryTextChange(String newText) {
// The newText is stored into a member variable that
// is used when the new CursorLoader is created.
mCurFilter = newText;
getActionBar().setSubtitle(mCurFilter);
getLoaderManager().restartLoader(0, null,
CustomersOverviewActivity.this);
return true;
}
});
return true;
}
重新启动的加载程序调用onCreateLoader
. 注意mCurFilter
用于构建 SQL 查询:
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
String[] projection = { CustomerTable._ID,
CustomerTable.CODE,
CustomerTable.NAME,
CustomerTable.STREET,
CustomerTable.TOWN };
String selection = null; // init
String[] selectionArgs = null; // init
if ( ! mCurFilter.isEmpty()) {
selection = CustomerTable.NAME + " like ?";
selectionArgs = new String[]{ "%" + mCurFilter +"%" };
}
CursorLoader cursorLoader = new CursorLoader(this,
DemoContentProvider.CUSTOMERS_CONTENT_URI, projection,
selection, selectionArgs,
orderInfo);
return cursorLoader;
}
我想检测在调用之前按下Up的情况。这样(比如说)我可以设置一个标志并阻止清空内容的分配。此外,当搜索图标再次展开时,我想在显示之前初始化展开中的文本(即展开视图预设有过滤器文本)。那怎么办?onQueryTextChange()
mCurFilter
SearchView
SearchView
mCurFilter
更新:较早的实现SearchView
有...
@Override
public void onActionViewCollapsed() {
clearFocus();
updateViewsVisibility(true);
mQueryTextView.setImeOptions(mCollapsedImeOptions);
mExpandedInActionView = false;
}
现在,它包含...
@Override
public void onActionViewCollapsed() {
setQuery("", false);
clearFocus();
updateViewsVisibility(true);
mQueryTextView.setImeOptions(mCollapsedImeOptions);
mExpandedInActionView = false;
}
您知道将查询设置为空字符串的原因是什么吗?我应该用旧代码覆盖新的实现吗?或者,还有更好的方法?