Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android SearchView.isFocused始终返回false_Android_Widget_Android Actionbar_Searchview - Fatal编程技术网

Android SearchView.isFocused始终返回false

Android SearchView.isFocused始终返回false,android,widget,android-actionbar,searchview,Android,Widget,Android Actionbar,Searchview,我试图确定ActionBar中的SearchView是否已聚焦。但是,当我调用SearchView.isFocused()时,结果总是得到false,即使视图真的聚焦了(里面有一个光标,并且显示了软键盘) 如何检查SearchView是否有焦点?经过一些研究,我了解到SearchView.isFocused()总是返回false,因为真正有焦点的是SearchView的某个孩子,而不是SearchView本身。因此,我使用以下代码检查SearchView的焦点: private boolean

我试图确定ActionBar中的
SearchView
是否已聚焦。但是,当我调用
SearchView.isFocused()
时,结果总是得到
false
,即使视图真的聚焦了(里面有一个光标,并且显示了软键盘)


如何检查
SearchView
是否有焦点?

经过一些研究,我了解到
SearchView.isFocused()
总是返回
false
,因为真正有焦点的是
SearchView
的某个孩子,而不是
SearchView
本身。因此,我使用以下代码检查SearchView的焦点:

private boolean checkFocusRec(View view) {
    if (view.isFocused())
        return true;

    if (view instanceof ViewGroup) {
        ViewGroup viewGroup = (ViewGroup) view;
        for (int i = 0; i < viewGroup.getChildCount(); i++) {
            if (checkFocusRec(viewGroup.getChildAt(i)))
                return true;
        }
    }
    return false;
}
private boolean checkFocusRec(视图){
if(view.isFocused())
返回true;
if(视图组的视图实例){
ViewGroup ViewGroup=(ViewGroup)视图;
对于(int i=0;i

所以我调用
checkFocusRec(searchView)
来检查焦点。我不确定这是否是最佳的解决方案,但它对我来说是有效的。

在查看这个问题及其答案时,我在Android SDK附带的资源文件中找到了一些额外的信息(在文件夹SDK/platforms/Android xx/data/res/layout/search_view.xml中)

持有焦点的子视图具有id
@+id/search\u src\u text
,类型为
android.widget.SearchView$SearchAutoComplete

因此,我建议采用以下替代方案:

从SearchView看,这似乎是一个丑陋(或bug)的实现。我的建议是扩展SearchView并创建如下方法:

var isQueryFocused = false
    private set

// you can also override hasFocus() and isFocused() methods, if you prefer
fun hasQueryFocus() = isQueryFocused

override fun setOnQueryTextFocusChangeListener(listener: OnFocusChangeListener?) {
    super.setOnQueryTextFocusChangeListener { v, hasFocus ->
        isQueryFocused = hasFocus
        listener?.onFocusChange(v, hasFocus)
    }
}

其他答案使用递归调用,这不是一个非常有效的私有资源ID(内部TextView ID),这是一个不好的做法。

Kotlin扩展版本:
val View.hasFocusRec:Boolean get()=当{IsFocus->true这是ViewGroup->children.any{it.hasFocusRec}else->false}
它需要
实现“androidx.core:core ktx”
var isQueryFocused = false
    private set

// you can also override hasFocus() and isFocused() methods, if you prefer
fun hasQueryFocus() = isQueryFocused

override fun setOnQueryTextFocusChangeListener(listener: OnFocusChangeListener?) {
    super.setOnQueryTextFocusChangeListener { v, hasFocus ->
        isQueryFocused = hasFocus
        listener?.onFocusChange(v, hasFocus)
    }
}