Android:SearchView setQuery不设置方向更改时的文本

Android:SearchView setQuery不设置方向更改时的文本,android,Android,我有一个SearchView,当设备方向改变时,我想通过编程方式扩展和设置它。我尝试了许多解决办法,但都没有奏效。如果仅使用setQuery,则会过滤我的列表,但如果同时使用expandActionView,则搜索视图不包含给定的搜索文本,并且会调用onQueryTextChange两次,第一次调用给定文本,第二次调用空文本 @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { menu

我有一个SearchView,当设备方向改变时,我想通过编程方式扩展和设置它。我尝试了许多解决办法,但都没有奏效。如果仅使用setQuery,则会过滤我的列表,但如果同时使用expandActionView,则搜索视图不包含给定的搜索文本,并且会调用onQueryTextChange两次,第一次调用给定文本,第二次调用空文本

@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中一个项目的源代码。您可以检查它们,这是一个非常简单的项目。

谢谢,但它不起作用,列表已过滤,但搜索视图未展开。