Android EditText自定义底部横线,3种设置方法,建议使用第3种

我们在实际项目经常遇到EditText输入框输入的时候底部横线需要变色或加粗的情况,本来网上有很多种方法都可以设置,但博主在实际搬砖中却出现了各种问题:

方法一:在styles.xml中设置

<style name="MyEditText" parent="Theme.AppCompat.Light">
    <item name="colorControlNormal">@color/color_normal</item>//默认颜色
    <item name="colorControlActivated">@color/color_activated</item>//输入时颜色
</style>
布局里面设置:
<EditText
                   
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"  
                    android:theme="@style/MyEditText" />

如果你的项目支持androidX,用以下代码

<androidx.appcompat.widget.AppCompatEditText
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:theme="@style/MyEditText" />

注:在华为手机上可能会设置失败(具体原因未知),而且底部线条会加粗,不建议使用!!!!!!

 

 

方法二:在drawable文件夹下创建 et_stroke.xml

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/shape"
        android:bottom="1dp"
        android:left="-10dp"
        android:right="-10dp"
        android:top="-10dp">
        <shape>
            <solid android:color="@color/transparent" />//透明
            <stroke
                android:width="1dp"
                android:color="@color/color_normal" />//默认颜色
        </shape>
    </item>
</layer-list>
public class MyEditText extends androidx.appcompat.widget.AppCompatEditText implements View.OnFocusChangeListener {
    private Context context;

    public void setOnCheckInputListener(OnCheckInputListener onCheckInputListener) {
        this.onCheckInputListener = onCheckInputListener;
    }

    private OnCheckInputListener onCheckInputListener;
    private GradientDrawable drawable;

    /**
     * 检测输入是否符合要求的回调
     */
    public interface OnCheckInputListener {
        /**
         * 检测输入的方法
         *
         * @param v   点击的view
         * @param str 输入的字符串
         * @return 检测成功返回true, 检测失败返回false
         */
        boolean checkInput(View v, String str);
    }

    public MyEditText(Context context) {
        this(context, null);
    }

    public MyEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.context = context;
        LayerDrawable layerDrawable = (LayerDrawable) getBackground();
        drawable = (GradientDrawable) layerDrawable.findDrawableByLayerId(R.id.shape);
        setOnFocusChangeListener(this);
    }


    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (hasFocus) {
//           获取焦点
            drawable.setStroke(1,             getResources().getColor(R.color.color_focused));//改变的颜色
        } else {
//           失去焦点
            drawable.setStroke(1, 
getResources().getColor(R.color.color_normal));//默认颜色
           
        }
    }
}

布局里面设置:

<你的包名.view.MyEditText
                   
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"  
                    android:background="@drawable/et_stroke" />

注:如果页面存在多个输入框,可能会有问题

 

 

方法三:在drawable文件夹下创建 et_normal.xml

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/shape"
        android:bottom="1dp"
        android:left="-10dp"
        android:right="-10dp"
        android:top="-10dp">
        <shape>
            <solid android:color="@color/transparent" />//透明
            <stroke
                android:width="1dp"
                android:color="@color/color_normal" />//默认颜色
        </shape>
    </item>
</layer-list>

drawable文件夹下创建 et_focused.xml

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/shape"
        android:bottom="1dp"
        android:left="-10dp"
        android:right="-10dp"
        android:top="-10dp">
        <shape>
            <solid android:color="@color/transparent" />//透明
            <stroke
                android:width="1dp"
                android:color="@color/color_focused" />//改变的颜色
        </shape>
    </item>
</layer-list>

drawable文件夹下创建 edittext_bg.xml

<?xml version="1.0" encoding="UTF-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/et_normal" android:state_window_focused="false" />
    <item android:drawable="@drawable/et_focused" android:state_focused="true" />
</selector>

布局里面设置:

<EditText
                   
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"  
                    android:background="@drawable/edittext_bg" />

注:建议使用该方法!!!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值