我们在实际项目经常遇到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" />
注:建议使用该方法!!!