在 Samsung Galaxy Tab A 上,clearFocus on editText 调用两次 onFocusChange (Android API 24)

2024-01-10

在视图上,我有一个 LinearLayout,当我单击下面的 EditText 时,我想折叠它,然后在我们取消焦点时展开它。

<EditText
            android:layout_width="1000dp"
            android:layout_height="43dp"
            android:layout_centerVertical="true"
            android:textSize="14.4sp"
            android:gravity="center_vertical"
            android:hint="@string/hint_query"
            android:layout_toEndOf="@+id/searchImage"
            android:id="@+id/searchBoxText"
            android:background="@null"
            android:layout_marginStart="16dp"
            android:inputType="text"
            tools:ignore="Autofill" />

感谢 Android-Annotations,我实现了一个 onFocusChangeListener。

@FocusChange
void searchBoxText(EditText searchBoxText) {
    Log.d("change focus", "focus has changed with " + searchBoxText.hasFocus());
    if (!searchBoxText.hasFocus()) {
        if(upperView != null)
            upperView.setVisibility(View.VISIBLE);
    } else {
        if(upperView != null)
            upperView.setVisibility(View.GONE);
    }
}

我在父级上有一个 touchListener ,它抛出:

searchBoxText.clearFocus();

当我们点击 EditText 之外的时候。

我的目标是让平板电脑支持最大 API 24。 我的问题是,这段代码在 API 28 中工作得很好,但在 API 24 上却不行,它会抛出 onFocusChange 两次,而且我没有找到任何原因来解释为什么它会这样做,也没有找到任何让它工作的方法。


我认为发生的情况是:

  1. 用户离开第一个项目(因此焦点从第一个项目离开,因此焦点“正在更改”,因此触发 onFocus Change 事件。

  2. 然后我们将焦点放在选定的第二项上,因此再次“focusChanged”,因此再次调用 onFocus Change 事件。 所以你可以这样做:

                    public void onFocusChange(View v, boolean b) {
                               if (v.hasFocus()){
                                     v.performClick()); // or any other logic you need
                               } 
                     }
    

    那么它只会执行一次您需要的操作(当 v 获得焦点时)。

祝你好运 :-)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Samsung Galaxy Tab A 上,clearFocus on editText 调用两次 onFocusChange (Android API 24) 的相关文章

随机推荐