在视图上,我有一个 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 两次,而且我没有找到任何原因来解释为什么它会这样做,也没有找到任何让它工作的方法。
我认为发生的情况是:
用户离开第一个项目(因此焦点从第一个项目离开,因此焦点“正在更改”,因此触发 onFocus Change 事件。
-
然后我们将焦点放在选定的第二项上,因此再次“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(使用前将#替换为@)