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

时间:2013-08-28 14:01:19

标签: android-listfragment android-support-library

我正在尝试在android developer's blog条目之后使用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值的第二次调用更新列表适配器以使所有项目不进行任何过滤。我也不确定为什么会这样。
  2. mSearchView.setQuery(mSearchText, false);未在SearchView中设置查询,并且在UI中也不可见(在方向更改时,搜索视图默认展开,并且在没有任何文本值的情况下进行了聚焦,尽管我已设置了查询)。
  3. 我的片段概要如下:

    @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中更改方向的状态。

2 个答案:

答案 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();
});