我正在尝试在android developer's blog条目之后使用actionbarcompat(使用android支持库)。
基本上,我正在尝试创建一个扩展ListFragment的Fragment。我正在使用ArrayAdapter作为列表视图。我能够成功地将操作栏compat与搜索菜单项集成,并且可以使搜索工作正常。
我现在也希望在方向改变时保留片段的状态。我没有在我的片段中设置setRetainInstance(true)。为了保留搜索视图的状态,我尝试了以下内容:
mSearchView.setQuery(mSearchText, false);
我用这种方法看到了两个问题:
mSearchView.setQuery(mSearchText, false);
),再次使用空字符串值。使用空String值的第二次调用更新列表适配器以使所有项目不进行任何过滤。我也不确定为什么会这样。mSearchView.setQuery(mSearchText, false);
未在SearchView中设置查询,并且在UI中也不可见(在方向更改时,搜索视图默认展开,并且在没有任何文本值的情况下进行了聚焦,尽管我已设置了查询)。我的片段概要如下:
@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中更改方向的状态。
答案 0 :(得分:2)
作为解决方法,请替换
mSearchView.setQuery(mSearchText, false);
使用:
final String s = mSearchText;
mSearchView.post(new Runnable() {
@Override
public void run() {
mSearchView.setQuery(s, false);
}
});
在系统设置空字符串后,它将设置保存的字符串。
答案 1 :(得分:0)
我用AppCompatActivity而不是Fragment做到了。我使用了与上述相同的解决方案,但是即使帖子显示在搜索视图中,也看不到搜索文本。我之前添加了菜单项扩展:
mSearchView.post(() -> {
searchItem.expandActionView();
mSearchView.setQuery(mSearchText, false);
mSearchView.clearFocus();
});