SearchView.isFocused始终返回false

问题描述 投票:2回答:3

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

我该如何检查SearchView是否专注?

android widget android-actionbar searchview
3个回答
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)来检查焦点。我不确定这是最佳解决方案,但它对我有用。


0
投票

在查看这个问题及其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();
}

0
投票

看起来像是一个来自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),这是一个不好的做法。

© www.soinside.com 2019 - 2024. All rights reserved.