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无效?的主要内容,如果未能解决你的问题,请参考以下文章

如何设置edittext默认不获取光标

EditText不显示光标怎么解决

Android 如何使edittext默认失去焦点

edittext禁止android软键盘弹出

在android中点击EditText的时候会弹出软键盘,这时候如果想隐藏软键盘或者填完内容后点其他的地方直接隐藏

Android EidtText 光标的使用和设置