Android SearchView.isFocused始终返回false
我试图确定ActionBar中的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
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)
}
}