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:

  1. 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.
  2. 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

Popular posts from this blog

Unable to remove the www from url on https using .htaccess -