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

时间:2018-10-31 12:32:00

标签: android xml

在一个视图上,我有一个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注释,我实现了一个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上却无法正常运行,在API 24上它两次抛出了onFocusChange,我没有发现任何原因或执行此操作的任何方式。

2 个答案:

答案 0 :(得分:0)

我认为会发生什么:

  1. 用户离开了第一项(因此焦点从第一项移开了,因此焦点处于“正在更改”状态,因此事件onFocuseChange触发了。

  2. 然后,我们将焦点集中在选定的第二个项目上,因此再次“ focusCahnged”,因此再次调用了onFocuseChange事件。 所以你可以做:

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

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

祝你好运:-)

答案 1 :(得分:0)

您可以在xml中为另一个视图添加isFocusable和FocusableInTouchMode