简体   繁体   中英

Restore state of android's search view widget

Im having a search view in my action bar and i want to restore the query after orientation changed. How can I do this? Setting the query from the bundle using SearchView.setQuery(query, false); doesn't work as the searchview sets its query to "" as soon as it expands.

Heres the relevant code in my onActivityCreated :

if(savedInstanceState != null && savedInstanceState.containsKey(BUNDLE_KEY_SEARCH))
    mCurFilter = savedInstanceState.getString(BUNDLE_KEY_SEARCH);

And here my onSaveInstanceState :

savedInstanceState.putString(BUNDLE_KEY_SEARCH, mCurFilter);
super.onSaveInstanceState(savedInstanceState);

So how can I restore its state as im not able to do it using setQuery ? Thanks to all

As a 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 will set the saved string after the system has set the empty string.

Yes, it is possible to restore the state of search view widget:

Use below code to save the search query text:

private String mSearchQuery;

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater menuInflater = getMenuInflater();

    menuInflater.inflate(R.menu.search_menu, menu);

    // Associate searchable configuration with the SearchView
    SearchManager searchManager =
            (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    SearchView searchView =
            (SearchView) menu.findItem(R.id.search).getActionView();

  searchView.setSearchableInfo(
            searchManager.getSearchableInfo(getComponentName()));

    if(mSearchQuery != null){
        searchView.setIconified(true);
        searchView.onActionViewExpanded();
        searchView.setQuery(mSearchQuery, false);
        searchView.setFocusable(true);
    }

    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener(){

        @Override
        public boolean onQueryTextSubmit(String query) {
            return false;
        }

        @Override
        public boolean onQueryTextChange(String newText) {
            mSearchQuery = newText;
            return false;
        }
    });

    return true;
}

 @Override
protected void onSaveInstanceState(Bundle outState) {
    outState.putString("searchQuery", mSearchQuery);
    super.onSaveInstanceState(outState);
}

Then in OnCreate() method of activity, add following lines:

    if(savedInstanceState != null){
        mSearchQuery = savedInstanceState.getString("searchQuery");
    }

There is better (in my opinion) way (without posting Runnable ) to avoid setting query to "" when you expand yours SearchView .

1) You will need one more String variable to store query.

//String that you fill in onQueryTextChange
String searchText;
//String, that is filled after you restore previous
String queryToSave;

2) After getting yours query from Bundle, store it in another variable.

if(this.searchText!=null)
{
    this.queryToSave=this.searchText;
}

3) In onQueryTextChange(String query) you fill searchText variable to text or to null if it's empty

4) In onMenuItemActionExpand(MenuItem item) you need save yours restored String ( searchText ) to another variable ( queryToSave ), because it ( searchText ) will set to null after there will be call to onQueryTextChange with empty text

if(searchText!=null)
{
    queryToSave=new StringBuffer(searchText).toString();
}

5) So now if you call

mSearchView.setQuery(queryToSave, false);

after expanding SearchView queryToSave won't be empty and you'll see expanded SearchView with yours restored text!

you should make this:

import android.support.v4.view.MenuItemCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.SearchView;
import android.view.Menu;
import android.view.MenuItem;

public class MainActivity extends AppCompatActivity {

    private SearchView mSearchView;
    private String mSearchString;
    private static final String SEARCH_KEY = "search";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // if you saved something on outState you can recover them here
        if (savedInstanceState != null) {
            mSearchString = savedInstanceState.getString(SEARCH_KEY);
        }
    }

    // This is called before the activity is destroyed
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        mSearchString = mSearchView.getQuery().toString();
        outState.putString(SEARCH_KEY, mSearchString);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);

        MenuItem searchMenuItem = menu.findItem(R.id.menu_main_action_search);

        mSearchView = (SearchView) MenuItemCompat.getActionView(searchMenuItem);

        //focus the SearchView
        if (mSearchString != null && !mSearchString.isEmpty()) {
            searchMenuItem.expandActionView();
            mSearchView.setQuery(mSearchString, true);
            mSearchView.clearFocus();
        }

        return super.onCreateOptionsMenu(menu);
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM