EditText clearFocus无效?
Posted 子不语归来
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了EditText clearFocus无效?相关的知识,希望对你有一定的参考价值。
EditText clearFocus无效?
之前在做一个功能需要根据Editext焦点获取的状态来做相应的逻辑处理,但在其中遇到了clearFocus,焦点先是没了,后又获取了的问题,这里我写下我的解决方法。本文虽然写的是EditText ,但其他View也是一样的。重点在第4点
1.如何判断 EditText的焦点获取状态
OnFocusChangeListener,android提供了OnFocusChangeListener监听View焦点的改变
editContent.setOnFocusChangeListener(new View.OnFocusChangeListener()
@SuppressLint("WrongConstant")
@Override
public void onFocusChange(View v, boolean hasFocus)
if (hasFocus)
//获取焦点时的逻辑
else
//失去焦点时的逻辑
);
2.代码手动改变View的焦点状态
获取焦点 editContent.requestFocus();
失去焦点 editContent.clearFocus();
3.普通情况下clearFocus和requestFocus无效
给当前操作的View的xmL布局加上一下代码
android:focusable="true"
android:focusableInTouchMode="true"
或者java代码
editContent.setFocusable(true);
editContent.setFocusableInTouchMode(true);
4.按照3操作以后还不成功
在布局比较复杂的情况下,3可能不会成功,当实行了clearFocus方法后,OnFocusChangeListener监听的onFocusChange方法中hasFocus会先是false,但立马又会变会hasFocus。什么原因造成的呢,我们来看下clearFocus的实现
clearFocus的调用栈(重要的部分):
View.clearFocus() ->
View.clearFocusInternal() ->
1. mParent.clearChildFocus(this);// 从该View一直向上遍历父节点,知道DecorView,作用是将parent(ViewGroup)中存储的mFocus设置为null,即清除焦点
2. rootViewRequestFocus();// 调用DecorView的requestFocus()方法,作用是找到视图中的一个View,并将其设置为焦点
根据上面列出的调用栈可以看出,清除focus其实包含2个部分的操作:
清除当前当前View的focus标志,并且清除它的祖先节点中存储的mFocus信息
调用DecorView的requestFocus()方法,重新寻找一个View,并将其设置为focus
因此,我们需要在你需要处理焦点的View的父布局里也处理下焦点,如下面代码,需对EditText的父布局添加
android:focusable="true"
android:focusableInTouchMode="true"
如此之后调用clearFocus方法后,OnFocusChangeListener监听的onFocusChange方法中hasFocus会变成flase,不会自动变回true
<LinearLayout
android:id="@+id/rela_comment"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/f5f5f5"
android:orientation="horizontal"
android:paddingBottom="5dp"
android:paddingLeft="15dp"
android:focusable="true"
android:focusableInTouchMode="true"
android:paddingTop="5dp">
<EditText
android:id="@+id/edit_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:background="@drawable/bg_radius_line_gray"
android:hint="发表评论"
android:maxLines="5"
android:minHeight="40dp"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:textColorHint="@color/color_gray_cbd0d8" />
</LinearLayout>
以上是关于EditText clearFocus无效?的主要内容,如果未能解决你的问题,请参考以下文章