我试图确定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;
}
所以我打电话给checkFocusRec(searchView)
来检查焦点。我不确定这是最佳解决方案,但它对我有用。
在查看这个问题及其solution时,我在Android SDK附带的资源文件中找到了一些额外的信息(在文件夹sdk / platforms / android-xx / data / res / layout / search_view.xml中)。
持有焦点的子视图具有id @+id/search_src_text
并且类型为android.widget.SearchView$SearchAutoComplete
。
因此,我建议以下替代以前的solution:
private boolean isSearchViewFocused(SearchView sview) {
View et_search = sview.findViewById(R.id.search_src_text);
return et_search.isFocused();
}
看起来像是一个来自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),这是一个不好的做法。