返回介绍

1.4 Listener

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

然后,我们来看看 SearchView 里面有哪些 Listener:

  //里面有 2 个方法:
    //onQueryTextSubmit(String query):当用户提交查询的时候会调用
    //onQueryTextChange(String newText):当查询文字改变的时候会调用
  private OnQueryTextListener mOnQueryChangeListener;
  
  //里面有 1 个方法:boolean onClose();
    //onClose():当 mCloseButton 被点击和 setIconified(true) 会判断是否调用
    //是否调用是在 onCloseClicked() 里判断,后面会进行分析 
  private OnCloseListener mOnCloseListener;
  
  //View 类里定义的接口
  private OnFocusChangeListener mOnQueryTextFocusChangeListener;
  
  //里面有 2 个方法:
    //onSuggestionSelect(int position):选择建议可选项(搜索框下方出现的)后触发
    //onSuggestionClick(int position):点击建议可选项后触发
  private OnSuggestionListener mOnSuggestionListener;
  
  //View 类里定义的接口
  private OnClickListener mOnSearchClickListener;

  //还有其他 mOnClickListener,mTextKeyListener 等

我们看看 OnQueryTextListener 是怎样进行监听的:

  • onQueryTextChange(String newText)
  //在构造方法里添加了监听
  mSearchSrcTextView.addTextChangedListener(mTextWatcher);

然后在 mTextWatcheronTextChanged() 方法里调用了 SearchView 的 onTextChanged(CharSequence newText) 方法, 也就是在这里进行了判断触发:

  private void onTextChanged(CharSequence newText) {
    /**
     * 省略代码,主要是更新组件
     */

    //当 listener!=null 和当文本不一样的时候会触发。
    if (mOnQueryChangeListener != null && !TextUtils.equals(newText, mOldQueryText)) {
      mOnQueryChangeListener.onQueryTextChange(newText.toString());
    }

    //省略代码
  }
  • onQueryTextSubmit(String query)
  //同在构造方法里添加了监听
  mSearchSrcTextView.setOnEditorActionListener(mOnEditorActionListener);

  private final OnEditorActionListener mOnEditorActionListener = new OnEditorActionListener() {
  
    /**
     * Called when the input method default action key is pressed.
     */
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
      onSubmitQuery();
      return true;
    }
  };

  private void onSubmitQuery() {
    CharSequence query = mSearchSrcTextView.getText();
    if (query != null && TextUtils.getTrimmedLength(query) > 0) {
      
      //当监听 OnQueryChangeListener 了之后,
      //当 onQueryTextSubmit() return true 的话,是不会执行下面操作的
      if (mOnQueryChangeListener == null
          || !mOnQueryChangeListener.onQueryTextSubmit(query.toString())) {
          
        //设置了 Searchable 后,会 startActivity 到配置指定的 Activity  
        if (mSearchable != null) {
          launchQuerySearch(KeyEvent.KEYCODE_UNKNOWN, null, query.toString());
        }
        //设置键盘是否显示
        setImeVisibility(false); 
        
        //下拉可选项是用 ListPopupWindow 显示的,具体可看 AutoCompleteTextView 源码
        //搜索提交后,dismiss 后就不会继续显示而挡住内容什么的
        dismissSuggestions();
      }
    }
  }

在 if 里加入 !mOnQueryChangeListener.onQueryTextSubmit(query.toString()) ,这样做就可以让使用者自己决定是否完全自己处理,灵活性也更高。

其他 Listener 差不多也是这样,那接下来看看其他的。

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

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

发布评论

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