4
我想在android developer's blog条目后面使用actionbarcompat(与Android支持库)。保留searchView状态在一个片段的方向变化
基本上,我想创建一个扩展ListFragment的片段。我为列表视图使用ArrayAdapter。我能够成功地将操作栏compat与搜索菜单项集成在一起,并且可以使搜索起作用。
我现在想保留方向改变的片段状态。我没有在我的片段中设置setRetainInstance(true)。序保留搜索视图的状态,我试过如下:
- 保存在的onSaveInstanceState()在onCreateView
- 在搜索查看文本,检索SEARCHTEXT如果可用 在onCreateOptionsMenu
- (这在每个方向改变调用的),我试图搜索查询设置为搜索查看实例
mSearchView.setQuery(mSearchText, false);
有2个问题,我用这种方法请参见:
- onQueryTextChange()在方向更改时调用了两次 - 一次是保留searchText(因为
mSearchView.setQuery(mSearchText, false);
),一次是空的String值。与空字符串值的第二次调用更新列表adapater以使所有项目没有任何过滤。我也不确定为什么会发生这种情况。 mSearchView.setQuery(mSearchText, false);
未在SearchView中设置查询,并且在用户界面中也不可见(对于方向更改,默认情况下,搜索视图会展开并且没有任何文本值,但我已设置查询)。我的片段的
大纲如下:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// create and initialize list adapter
....
setHasOptionsMenu(true);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.plainlist, container, false);
if (savedInstanceState != null) {
mSearchText = savedInstanceState.getString(RetainDataKeySearchText, null);
}
return view;
}
@Override
public void onSaveInstanceState(Bundle outState) {
if (isAdded()) {
if (mSearchView != null) {
String searchText = mSearchView.getQuery().toString();
if (!TextUtils.isEmpty(searchText))
outState.putString(RetainDataKeySearchText, searchText);
}
}
super.onSaveInstanceState(outState);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.search_item_list, menu);
MenuItem searchItem = menu.findItem(R.id.menu_search);
mSearchView = (SearchView) MenuItemCompat.getActionView(searchItem);
mSearchView.setOnQueryTextListener(this);
if (!TextUtils.isEmpty(mSearchText))
mSearchView.setQuery(mSearchText, false);
super.onCreateOptionsMenu(menu, inflater);
}
@Override
public boolean onQueryTextChange(String newText) {
// Called when the action bar search text has changed.
searchItems(newText);
return true;
}
@Override
public boolean onQueryTextSubmit(String searchText) {
return true;
}
private void searchItems(String searchText) {
// filter results and update the list adapter
}
菜单XML(search_item_list)文件如下:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:sprinklr="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/menu_search"
android:icon="@android:drawable/ic_menu_search"
android:title="@string/search"
android:orderInCategory="0"
sprinklr:showAsAction="ifRoom|collapseActionView"
sprinklr:actionViewClass="android.support.v7.widget.SearchView" />
</menu>
我想知道如果有什么我我错过了,或者是否有更好的替代方法来保留SearchView(android.support.v7.widget.SearchView
)的状态,以便在带有actionbarcompat的ListFragment中更改方向。