Android:SearchView setQuery不设置方向更改时的文本
我有一个SearchView,当设备方向改变时,我想通过编程方式扩展和设置它。我尝试了许多解决办法,但都没有奏效。如果仅使用setQuery,则会过滤我的列表,但如果同时使用expandActionView,则搜索视图不包含给定的搜索文本,并且会调用onQueryTextChange两次,第一次调用给定文本,第二次调用空文本Android:SearchView setQuery不设置方向更改时的文本,android,Android,我有一个SearchView,当设备方向改变时,我想通过编程方式扩展和设置它。我尝试了许多解决办法,但都没有奏效。如果仅使用setQuery,则会过滤我的列表,但如果同时使用expandActionView,则搜索视图不包含给定的搜索文本,并且会调用onQueryTextChange两次,第一次调用给定文本,第二次调用空文本 @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { menu
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
menu.clear();
inflater.inflate(R.menu.activity, menu);
SearchManager searchManager = (SearchManager) getActivity().getSystemService(Context.SEARCH_SERVICE);
MenuItem searchMenuItem = menu.findItem(R.id.search);
SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchMenuItem);
searchView.setIconifiedByDefault(true);
searchView.setSearchableInfo(searchManager.getSearchableInfo(getActivity().getComponentName()));
searchView.setOnQueryTextListener(this);
MenuItemCompat.setOnActionExpandListener(searchMenuItem, new MenuItemCompat.OnActionExpandListener() {
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
mCurrentQueryString = null;
if (mAdapter != null) {
mAdapter.clearFilter();
mStopSearching = true;
}
return true;
}
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
if (mAdapter != null) {
mStopSearching = false;
}
return true;
}
});
mSearchView = searchView;
mSearchMenuItem = searchMenuItem;
mSearchView.post(new Runnable() {
@Override
public void run() {
MenuItemCompat.expandActionView(mSearchMenuItem);
mSearchView.setQuery(mCurrentQueryString, true);
}
});
super.onCreateOptionsMenu(menu, inflater);
}
我在视图寻呼机中使用的片段中使用搜索视图。片段被保留。问题是onQueryTextChange函数被调用了两次,第二次调用的是空文本,但我不知道为什么。当片段初始化时,当我第一次打开搜索视图时,也会使用空文本调用此函数,但当关闭serach视图并再次打开它时,不会调用此函数
我怎样才能解决它呢?我也面临着这个问题。我提出的解决方案是通过与handler发布
@Override public boolean onPrepareOptionsMenu(Menu menu) {
...
// SearchView doesn't retain it's state after orientation change
// have to handle it the bad way (╯°□°)╯︵ ┻━┻
boolean isQueryExists = !TextUtils.isEmpty(mSearchQuery);
if (isQueryExists) {
// Calling directly doesn't take effect
// Custom runnable class in order to refrain from context leakage
new Handler(Looper.getMainLooper()).post(new SearchMenuRunnable(mSearchView, mSearchQuery));
}
...
}
SearchMenuRunnable.java
public class SearchMenuRunnable implements Runnable {
private WeakReference<SearchView> mSearchViewWeakReference;
private String mSearchQuery;
public SearchMenuRunnable(SearchView searchView, String searchQuery) {
mSearchViewWeakReference = new WeakReference<>(searchView);
mSearchQuery = searchQuery;
}
@Override public void run() {
if (null != mSearchViewWeakReference.get()) {
SearchView searchView = mSearchViewWeakReference.get();
searchView.setIconified(false);
searchView.setQuery(mSearchQuery, true);
searchView.clearFocus();
}
}
公共类SearchMenuRunnable实现可运行{
私有WeakReference mSearchViewWeakReference;
私有字符串查询;
公共SearchMenuRunable(SearchView SearchView、字符串searchQuery){
mSearchViewWeakReference=新的WeakReference(搜索视图);
mSearchQuery=searchQuery;
}
@重写公共无效运行(){
if(null!=mSearchViewWeakReference.get()){
SearchView SearchView=mSearchViewWeakReference.get();
searchView.setIconified(false);
setQuery(mSearchQuery,true);
searchView.clearFocus();
}
}
这是github中一个项目的源代码。您可以检查它们,这是一个非常简单的项目。谢谢,但它不起作用,列表已过滤,但搜索视图未展开。