SearchView.isFocused始终返回false

时间:2014-06-06 13:13:28

标签: android widget android-actionbar searchview

我正在尝试确定ActionBar中的SearchView是否重点关注。但是当我调用SearchView.isFocused()时,我总是得到false,即使视图真正被聚焦(内部有一个光标,并且显示了软键盘)。

如何检查SearchView是否重点关注?

3 个答案:

答案 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),这是不好的做法。