如何让SearchView在重新打开后保留其最后的查询内容?

时间:2015-05-04 18:54:06

标签: android android-actionbar android-search android-searchmanager android-filter

使用搜索视图时,我要求客户在重新打开搜索视图后保留搜索内容。 “我的搜索”视图位于列表视图中,并根据用户在搜索框中输入的内容进行实时定时过滤。通过单击手机上的后退按钮关闭搜索框或单击操作栏左上角的软后退按钮,搜索框关闭,搜索视图图标。但是下次重新打开时,上次使用的搜索查询也被清除了,这是我不想要的。

我的问题是,我可以通过哪种方式保留搜索视图内容。只是隐藏搜索框,但不清楚内容?

我的相关代码如下:

MenuItem search;
SearchView searchView;

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.menu_locationlist_fragment, menu);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        search = menu.findItem(R.id.action_search_location_list);
        searchView = (SearchView) MenuItemCompat.getActionView(search);
        SearchManager searchManager = (SearchManager) getActivity().getSystemService(Context.SEARCH_SERVICE);
            searchView.setSearchableInfo(searchManager.getSearchableInfo(getActivity().getComponentName()));
        searchView.setIconifiedByDefault(false);
        searchView.setOnQueryTextListener(this);


        searchView.setOnQueryTextFocusChangeListener(new View.OnFocusChangeListener() {

            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                //This will make sure, when user closed search view, the list will be restored.
                if(!hasFocus) {
                    Log.i(Tags.LOCATIONLIST,"Search Close");

                    search.collapseActionView();
                } else {

                   }
                }
            }
        });

        ImageView closeButton = (ImageView)searchView.findViewById(R.id.search_close_btn);
        closeButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                EditText searchEditText = (EditText)searchView.findViewById(R.id.search_src_text);
                searchEditText.setText("");
                if (((LocationListAdapter)locationListView.getAdapter())!=null) {
                    ((LocationListAdapter) locationListView.getAdapter()).getFilter().filter("");
                }
            }
        });

    }
}

@Override
          public boolean onOptionsItemSelected(MenuItem item) {
              switch (item.getItemId()) {
                  case R.id.action_search_location_list:
                      ((BaseActivity) getActivity()).onSearchRequested();
                      return true;
                  case R.id.action_refresh_location_list:
                      refreshLocationList();
                      return true;
                  default:
                      return false;
              }
          }

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

@Override
          public boolean onQueryTextChange(String s) {
              if (((LocationListAdapter)locationListView.getAdapter())!=null) {
                  if (TextUtils.isEmpty(s)) {
                      locationListView.clearTextFilter();
                  } else {
                      ((LocationListAdapter) locationListView.getAdapter()).getFilter().filter(s);
                      //locationListView.setFilterText(s.toString());
                  }
              }

              return true;
          }

4 个答案:

答案 0 :(得分:2)

使用

SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView();
    searchView.setIconified(false);

图标化时会清除任何查询文本。所以setIconified为false。我使用了android.widget.SearchView

答案 1 :(得分:1)

将您的字符串保存在变量中(例如myWantedString)和 每次打开SearchView时都会覆盖setOnClickListener,并使用setQuery。你的代码应该是:

searchView.setOnSearchClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                searchView.setQuery(myWantedString, false);
            }
        });

每次SearchView关闭工具setOnCloseListener并覆盖onClose()时保存字符串:

searchView.setOnCloseListener(new SearchView.OnCloseListener()
        {
            @Override
            public boolean onClose()
            {
                myWantedString = searchView.getQuery();
                return false;
            }
        });

答案 2 :(得分:1)

searchView.setQuery()在菜单项扩展后延迟调用时有效。

    MenuItemCompat.setOnActionExpandListener(searchItem, new MenuItemCompat.OnActionExpandListener() {
        @Override
        public boolean onMenuItemActionExpand(MenuItem item) {
            final SearchView searchView = (SearchView) MenuItemCompat.getActionView(item);
            // set query text with a delay
            searchView.post(new Runnable() {
                @Override
                public void run() {
                    searchView.setQuery(query, false);
                }
            });
            return true;
        }

        @Override
        public boolean onMenuItemActionCollapse(MenuItem item) {
            return true;
        }
    });

答案 3 :(得分:0)

 MenuItem searchItem = menu.findItem(R.id.action_search);
 SearchView searchView = (SearchView) searchItem.getActionView();
 searchView.setIconified(false);
 searchView.setOnSearchClickListener(new View.OnClickListener() {
     @Override
     public void onClick(View v) {
         searchView.setQuery("SEARCH_WORD", false);
     }
 });

https://developer.android.com/reference/android/widget/SearchView 设置一个侦听器,以通知何时按下搜索按钮。这仅在默认情况下不显示文本字段时才有意义。调用setIconified(false)也会导致此侦听器被通知。