Android SearchView:setOnFocusChangeListener() 和 setOnQueryTextFocusChangeListener 有什么区别?

Android SearchView: What is the difference between setOnFocusChangeListener() and setOnQueryTextFocusChangeListener?

来自参考文档,

SearchView.setOnQueryTextFocusChangeListener - 设置一个侦听器以在查询文本字段的焦点发生变化时发出通知。

View.setOnFocusChangeListener - 注册一个回调,当这个视图的焦点改变时调用。

那么,在 SearchView 的情况下,两者之间有什么区别?当 SearchView 已经从 View class 继承了 setOnFocusChangedListener 时,为什么他们需要提供 setOnQueryTextFocusChangeListener

如果您查看 source code 中的 SearchView,您会发现从技术上讲,这两个替代项的工作行为没有区别。代理监听器的部分代码是:

 // Inform any listener of focus changes
 mQueryTextView.setOnFocusChangeListener(new OnFocusChangeListener() {
     public void onFocusChange(View v, boolean hasFocus) {
         if (mOnQueryTextFocusChangeListener != null) {
             mOnQueryTextFocusChangeListener.onFocusChange(SearchView.this, hasFocus);
         }
     }
 });

原因是 SearchView 是一个 ViewGroup 用于查询文本的目的,并且通过使其更接近,提供了一个具有非常具体名称的单独方法,它只是代理到AutoCompleteTextView里面现有的setOnFocusChangeListener方法。