Android:SearchView setQuery不会在方向更改

时间:2017-03-23 10:16:52

标签: android

我有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视图并再次打开它时,不会调用此函数。

我该如何解决?

1 个答案:

答案 0 :(得分:1)

我也遇到过这个问题。我提出的解决方案是通过处理程序发布。

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.java

test <- data.frame(dates = as.Date(c("2016-10-31","2016-11-30", "2016-12-31", "2017-01-31")), 
                   values = c(1, 2, 3, 4))
ggplot(test, aes(x = dates, y = values)) +
  geom_bar(position="stack", stat = "identity") + 
  scale_x_date(breaks = date_breaks("1 months"),labels = date_format("%b-%y"))

这是来自github中的一个项目的来源。你可以检查它们here,它是一个非常简单的项目。

相关问题