【问题标题】:retain searchView state on orientation change in a Fragment在片段中的方向更改时保留 searchView 状态
【发布时间】:2013-08-28 14:01:18
【问题描述】:

我正在尝试在android developer's blog 条目之后使用 actionbarcompat(带有 android 支持库)。

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

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

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

我发现这种方法有 2 个问题:

  1. onQueryTextChange() 在方向改变时被调用两次 - 一次是使用已保留的 searchText(因为mSearchView.setQuery(mSearchText, false);),另一次是空字符串值。使用空字符串值的第二次调用会更新列表适配器以包含所有项目而无需任何过滤。我也不确定为什么会这样。
  2. mSearchView.setQuery(mSearchText, false); 没有在 SearchView 中设置查询,并且在 UI 中也不可见(在方向更改时,搜索视图默认展开,并且在没有任何文本值的情况下聚焦,尽管我已经设置了查询)。李>

我的 Fragment 大纲如下:

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

【问题讨论】:

    标签: android-listfragment android-support-library


    【解决方案1】:

    作为一种解决方法,更换您的

    mSearchView.setQuery(mSearchText, false); 
    

    与:

    final String s = mSearchText;
    
    mSearchView.post(new Runnable() {
    
        @Override
        public void run() {
            mSearchView.setQuery(s, false);
        }
    });
    

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

    【讨论】:

      【解决方案2】:

      我是用 AppCompatActivity 而不是 Fragment 来做的。我使用了与上述等效的解决方案,但即使在搜索视图上发布帖子,搜索文本也不可见。我之前添加了菜单项扩展:

      mSearchView.post(() -> {
          searchItem.expandActionView();
          mSearchView.setQuery(mSearchText, false);
          mSearchView.clearFocus();
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-14
        • 1970-01-01
        • 2013-08-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多