EditText clearFocus无效?

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010123643/article/details/72844045

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>

猜你喜欢

转载自blog.csdn.net/u010123643/article/details/72844045