2013-08-28 65 views
4

我想在android developer's blog条目后面使用actionbarcompat(与Android支持库)。保留searchView状态在一个片段的方向变化

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

我现在想保留方向改变的片段状态。我没有在我的片段中设置setRetainInstance(true)。序保留搜索视图的状态,我试过如下:

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

有2个问题,我用这种方法请参见:

  1. onQueryTextChange()在方向更改时调用了两次 - 一次是保留searchText(因为mSearchView.setQuery(mSearchText, false);),一次是空的String值。与空字符串值的第二次调用更新列表adapater以使所有项目没有任何过滤。我也不确定为什么会发生这种情况。
  2. 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中更改方向。

回答

2

作为一种变通方法,代替你的

mSearchView.setQuery(mSearchText, false); 

有:

final String s = mSearchText; 

mSearchView.post(new Runnable() { 

    @Override 
    public void run() { 
     mSearchView.setQuery(s, false); 
    } 
}); 

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

相关问题