Java 恢复android的状态';s搜索视图小部件
我的操作栏中有一个搜索视图,我想在方向更改后恢复查询。我该怎么做?使用Java 恢复android的状态';s搜索视图小部件,java,android,android-fragments,android-widget,searchview,Java,Android,Android Fragments,Android Widget,Searchview,我的操作栏中有一个搜索视图,我想在方向更改后恢复查询。我该怎么做?使用SearchView.setQuery(query,false)从包中设置查询不起作用,因为searchview在展开时会将其查询设置为“” 以下是myOnActivity Created中的相关代码: if(savedInstanceState != null && savedInstanceState.containsKey(BUNDLE_KEY_SEARCH)) mCurFilter = save
SearchView.setQuery(query,false)从包中设置查询代码>不起作用,因为searchview在展开时会将其查询设置为“”
以下是myOnActivity Created
中的相关代码:
if(savedInstanceState != null && savedInstanceState.containsKey(BUNDLE_KEY_SEARCH))
mCurFilter = savedInstanceState.getString(BUNDLE_KEY_SEARCH);
这里是我的存储实例状态
:
savedInstanceState.putString(BUNDLE_KEY_SEARCH, mCurFilter);
super.onSaveInstanceState(savedInstanceState);
那么,当我无法使用setQuery
恢复它的状态时,我该如何恢复它的状态呢?
多亏了all作为一种解决方法,请更换您的
mSearchView.setQuery(mSearchText, false);
与:
在系统设置空字符串后,它将设置保存的字符串。在我看来,有一种更好的方法(无需发布可运行的)来避免在展开您的搜索视图时将查询设置为“”
1) 您还需要一个字符串变量来存储查询
//String that you fill in onQueryTextChange
String searchText;
//String, that is filled after you restore previous
String queryToSave;
2) 从Bundle获取查询后,将其存储在另一个变量中
if(this.searchText!=null)
{
this.queryToSave=this.searchText;
}
3) 在onQueryTextChange(字符串查询)中,将searchText变量填充为text,如果为空则填充为null
4) 在onMenuItemActionExpand(MenuItem项目)中,您需要将恢复的字符串(searchText)保存到另一个变量(QuerySave)中,因为在调用带有空文本的onQueryTextChange后,它(searchText)将设置为null
if(searchText!=null)
{
queryToSave=new StringBuffer(searchText).toString();
}
5) 所以现在如果你打电话
mSearchView.setQuery(queryToSave, false);
展开搜索视图后查询保存将不会为空,您将看到展开的搜索视图和您还原的文本 您应该这样做:
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);
}
}
是,可以恢复搜索视图小部件的状态:
使用以下代码保存搜索查询文本:
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);
}
然后在活动的OnCreate()方法中,添加以下行:
if(savedInstanceState != null){
mSearchQuery = savedInstanceState.getString("searchQuery");
}
谢谢,我试试这个。
if(savedInstanceState != null){
mSearchQuery = savedInstanceState.getString("searchQuery");
}