我正在尝试确定ActionBar中的SearchView
是否重点关注。但是当我调用SearchView.isFocused()
时,我总是得到false
,即使视图真正被聚焦(内部有一个光标,并且显示了软键盘)。
如何检查SearchView
是否重点关注?
答案 0 :(得分:2)
经过一番研究后,我了解到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)
来检查焦点。我不确定这是最佳解决方案,但它对我有用。
答案 1 :(得分:0)
在查看此问题及其solution时,我在Android SDK附带的资源文件中找到了一些额外信息(位于文件夹 sdk / platforms / android-xx / data / res / layout /search_view.xml )。
子视图保持焦点的标识为@+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();
}
答案 2 :(得分:0)
看起来像SearchView中的丑陋(或错误)实现。我的建议是扩展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),这是不好的做法。