android listfragment - retain searchView state on orientation change in a Fragment -
i trying use actionbarcompat (with android support library) following android developer's blog entry.
basically, trying create fragment extending listfragment. using arrayadapter listview. able integrate actionbar compat search menu item , search working well.
i want retain state of fragment on orientation change well. haven't set setretaininstance(true) in fragment. inorder retain state of search view, tried following:
- save text in searchview in onsaveinstancestate()
- in oncreateview, retrieve searchtext if available
- in oncreateoptionsmenu (which invoked on every orientation change), trying set search query searchview instance
msearchview.setquery(msearchtext, false);
there 2 issues see approach:
- the onquerytextchange() called twice on orientation change - once searchtext has been retained (because of
msearchview.setquery(msearchtext, false);
) , again, empty string value. second call empty string value updates list adapater have items without filtering. not sure why happening. msearchview.setquery(msearchtext, false);
isn't setting query in searchview , not visible in ui (on orientation change, search view expanded default , focused without text value though have set query).
outline of fragment follows:
@override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); // create , 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 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 , update list adapter }
the menu xml (search_item_list) file follows:
<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>
i know if there missing or if there better alternate retain state of searchview (android.support.v7.widget.searchview
) on orientation change in listfragment actionbarcompat.
as workaround, replace your
msearchview.setquery(msearchtext, false);
with:
final string s = msearchtext; msearchview.post(new runnable() { @override public void run() { msearchview.setquery(s, false); } });
it set saved string after system has set empty string.
Comments
Post a Comment