返回介绍

1.7 关于 Suggestions 和 Searchable

发布于 2024-12-23 21:07:34 字数 2242 浏览 0 评论 0 收藏 0

如果你使用了 Suggestions,而且没有 setSearchableInfo,那么当你点击建议可选项的时候会 log:

W/SearchView: Search suggestions cursor at row 0 returned exception.
        java.lang.NullPointerException
          at android.support.v7.widget.SearchView.createIntentFromSuggestion(SearchView.java:1620)
          at android.support.v7.widget.SearchView.launchSuggestion(SearchView.java:1436)
          at android.support.v7.widget.SearchView.onItemClicked(SearchView.java:1349)
          at android.support.v7.widget.SearchView.access$1800(SearchView.java:103)
          at android.support.v7.widget.SearchView$10.onItemClick(SearchView.java:1373)
          ......

定位到第 1620 行:

  private Intent createIntentFromSuggestion(Cursor c, int actionKey, String actionMsg) {
    try {

      // use specific action if supplied, or default action if supplied, or fixed default
      String action = getColumnString(c, SearchManager.SUGGEST_COLUMN_INTENT_ACTION);

      //在这里并没有检查 mSearchable 是否为 null
      if (action == null && Build.VERSION.SDK_INT >= 8) {
        action = mSearchable.getSuggestIntentAction();  //第 1620 行
      }

      /**
       *省略部分代码
       */

      return createIntent(action, dataUri, extraData, query, actionKey, actionMsg);
    } catch (RuntimeException e ) {

      /**
       *省略部分代码
       */

      Log.w(LOG_TAG, "Search suggestions cursor at row " + rowNum +
                  " returned exception.", e);
      return null;
    }
  }

发现调用 mSearchable 的方法之前并没有检查 mSearchable 是否为 null,其他地方是有判断的,由于做了 catch 所以不会 crash, 也不影响使用,另外,如果 setOnSuggestionListener:

  mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
    @Override
    public boolean onQueryTextSubmit(String query) {
      return false;
    }

    @Override
    public boolean onQueryTextChange(String newText) {
      return true; //返回 true
    }
  });

onSuggestionClick(int position) 返回 true 就不会执行 createIntentFromSuggestion(~) , 也就不会 log 了,但这样,键盘的隐藏和可选项 pop 的 dismiss 也不会执行,需要自己处理,使用 SearchView 的 clearFocus() 方法就能达到同样的效果。

那既然是报 null,那就设置 Searchable 吧,设置后是会 startActivity 的(执行完 createIntentFromSuggestion(~) 后就会执行)。 然后效果就是当你点击了可选项就会 startActivity,看需求做选择吧。。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文