在一个视图上,我有一个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,我没有发现任何原因或执行此操作的任何方式。
答案 0 :(得分:0)
我认为会发生什么:
用户离开了第一项(因此焦点从第一项移开了,因此焦点处于“正在更改”状态,因此事件onFocuseChange触发了。
然后,我们将焦点集中在选定的第二个项目上,因此再次“ 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