【问题标题】:Execute Searches While Typing键入时执行搜索
【发布时间】:2015-02-20 22:03:33
【问题描述】:

我有一个有效的可搜索ActivityActionBarandroid.support.v7.widget.SearchView 中提交输入后查询远程数据库(在软键盘上输入“Go”)。这很好用,但我最终想在每次SearchView 的文本通过添加或删除字符更改时查询数据库。我的SearchView的初始化代码如下。

SearchFragment.java(上面提到的可搜索Activity的子片段)

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

    // Get the searchable.xml data about the search configuration
    final SearchManager searchManager = (SearchManager) getActivity().getSystemService(Context.SEARCH_SERVICE);
    SearchableInfo searchInfo = searchManager.getSearchableInfo(getActivity().getComponentName());
    // Associate searchable configuration with the SearchView
    mSearchView = (SearchView) menu.findItem(R.id.menu_item_search).getActionView();
    mSearchView.setSearchableInfo(searchInfo);
    mSearchView.requestFocus();
    mSearchView.onActionViewExpanded();
    getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
    mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {
            mSearchListAdapter.clear();
            return false;
        }

        @Override
        public boolean onQueryTextChange(String query) {
            mSearchListAdapter.clear();
            // Execute search ...
            return false;
        }
    });
}

我想这项工作需要在上面的onQueryTextChange(String query) 方法中完成,但我不确定需要调用什么。我想过调用SearchManagerstartSearch 实例方法,但这似乎不是最佳实践。有没有人有任何类型搜索的经验并愿意分享一个有效的解决方案?

更新:

MainActivity.java(可搜索的Activity

@Override
protected void onNewIntent(Intent intent) {
    setIntent(intent);

    if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
        // Handle the search for a particular musical object
        final SearchFragment searchFragment = (SearchFragment) getFragmentManager().findFragmentByTag(SearchFragment.TAG);
        String query = intent.getStringExtra(SearchManager.QUERY);

        mWebService.searchTracks(query, new Callback<Pager>() {
            @Override
            public void success(Pager results, Response response) {
                Log.d(TAG, "Search response received.");
                searchFragment.updateItems(results);
            }
            @Override
            public void failure(RetrofitError retrofitError) {
                Log.e(TAG, "Search response failed: " + retrofitError.toString());
            }
        });

上面的search interface design是谷歌Android团队推荐的。

【问题讨论】:

    标签: android search searchview


    【解决方案1】:

    到目前为止,在阅读了几页文档后,我遇到的唯一解决方案是简单地发送带有 Intent.ACTION_SEARCH 操作的意图和来自 SearchView 的当前查询,以在任何时候启动可搜索的 Activity SearchView 的文字发生变化。请记住,就SearchManager 设计而言,这可能不是最佳实践,但它确实有效。我会在以后重新审视这种方法,如果我遇到任何新情况,我会在这里报告。

    @Override
    public boolean onQueryTextChange(String query) {
         mSearchListAdapter.clear();
         if (!query.isEmpty()) {
              Intent searchIntent = new Intent(getActivity(), MainActivity.class);
              searchIntent.setAction(Intent.ACTION_SEARCH);
              searchIntent.putExtra(SearchManager.QUERY, query);
              startActivity(searchIntent);
         }
         return false;
    }
    

    【讨论】:

    • 现在是 2018 年,他没有遇到任何新的东西。对我们不利!
    【解决方案2】:

    TextWatcher 应该是您正在寻找的。它还提供在文本更改之前或之后执行代码。

    http://developer.android.com/reference/android/text/TextWatcher.html

     When an object of a type is attached to an Editable, its methods will be called when the text is changed.
    

    【讨论】:

      【解决方案3】:

      这是您正在寻找的问题的完美解决方案。

      看到这将帮助你... Android Action Bar SearchView as Autocomplete?

      【讨论】:

      • 我不希望提供自动完成的搜索建议。我只是在寻找一种方法,每次在SearchView 中输入或删除字符时,对远程数据库执行搜索查询。
      • 你会为此向另一个远程服务器发起 api 调用吗?
      • 是的。每次更改 SearchView 的文本时都需要调用 API。我基本上是在寻找正确的方式来在查询文本更改时调用 Searchable Activity 的搜索服务。
      • 似乎 AsyncTask 是您正在寻找的。您可以在方法“onQueryTextChange(String query)”中进行 api 调用,当响应返回时,使用响应更新 SearchView 的适配器
      • 我使用的是谷歌安卓团队推荐的搜索界面设计。它涉及使用处理ACTION_SEARCH 意图的可搜索 活动。然后从SearchManager 中提取查询。这是我的异步 API 调用发生的地方。我的原始帖子已更新以反映这一点。除了从我的SearchFragment 开始一个意图之外,我正在寻找调用我的可搜索活动的正确方法,因为其他操作很可能发生在我无法通过启动一个意图来控制的背景中.
      【解决方案4】:

      如果您仍在寻找更好的解决方案: 我刚刚找到this 对类似问题的回答,它使用了

      searchView.setOnQueryTextListener(this);
      

      这正是你想要的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-05-13
        • 2014-06-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-09
        相关资源
        最近更新 更多