保留searchView状态的片段中的方向更改

use*_*461 5 android-listfragment android-support-library

我正在尝试使用android开发者的博客条目后面的actionbarcompat(与android支持库).

基本上,我正在尝试创建一个扩展ListFragment的Fragment.我正在使用ArrayAdapter作为列表视图.我能够成功地将操作栏compat与搜索菜单项集成,并且可以使搜索工作正常.

我现在也希望保留片段在方向变化上的状态.我没有在我的片段中设置setRetainInstance(true).为了保留搜索视图的状态,我尝试了以下方法:

  • 在onSaveInstanceState()中保存SearchView中的文本
  • 在onCreateView中,检索searchText(如果可用)
  • 在onCreateOptionsMenu(将在每个方向更改时调用),我试图将搜索查询设置为SearchView实例 mSearchView.setQuery(mSearchText, false);

我用这种方法看到了两个问题:

  1. 在方向更改时调用onQueryTextChange()两次 - 一次使用已保留的searchText(因为mSearchView.setQuery(mSearchText, false);),再次使用空String值.使用空String值的第二次调用更新列表适配器以使所有项目不进行任何过滤.我也不确定为什么会这样.
  2. mSearchView.setQuery(mSearchText, false); 没有设置在搜索查看查询,并没有在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
}
Run Code Online (Sandbox Code Playgroud)

菜单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>
Run Code Online (Sandbox Code Playgroud)

我想知道是否有任何我遗漏的内容,或者是否有更好的替代方法可以android.support.v7.widget.SearchView在带有actionbarcompat的ListFragment中保留SearchView()状态的方向更改.

Fra*_*ank 3

作为解决方法,请替换您的

mSearchView.setQuery(mSearchText, false); 
Run Code Online (Sandbox Code Playgroud)

和:

final String s = mSearchText;

mSearchView.post(new Runnable() {

    @Override
    public void run() {
        mSearchView.setQuery(s, false);
    }
});
Run Code Online (Sandbox Code Playgroud)

系统设置空字符串后,将设置保存的字符串。