Android EditText光标问题

以前一直没有注意过 EditText 光标的问题,今天有人提了优化用户体验建议。自己就着手优化了下,不是什么大问题,但是还是有一些小坑,以此记录,避免下次在踩坑。

全局修改光标颜色

全局光标颜色修改很容易,找到 AndroidManifest文件,查看 "android:theme="@style/AppTheme",查看 AppTheme的属性,其中 <item name="colorAccent">@color/colorAccent</item>就是设置全局的获取焦点后的光标颜色,可以修改这里变成我们需求的色值。XML设置的代码,跟往常一样即可。

PS:这个是全局修改,修改了这个属性的颜色值,项目中用到此颜色值的相关组件颜色都会产生变化,比如状态栏。建议慎重。

修改单个EditText光标颜色

在 Android3.2 或者更高版本上面,EditText 有一个属性:android:textCursorDrawable,可以按照如下的方式进行设置。

创建光标颜色的 drawable 资源文件

需要创建光标颜色的 drawable 资源文件。举例如下:

1
2
3
4
5
6
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<size android:width="1dp" />
<solid android:color="#33a0ff" />
</shape>
使用android:textCursorDrawable=""属性。

XML 布局中,使用android:textCursorDrawable="@drawable/color_cursor",这个属性是用来控制光标颜色的。完整代码:

1
2
3
4
5
6
7
8
9
10
<EditText
android:id="@+id/minutes"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/dp_15"
android:background="@null"
android:cursorVisible="true"
android:textCursorDrawable="@drawable/color_cursor"
android:focusableInTouchMode="true"
/>

设置光标颜色与文本颜色一致

很简单,将android:textCursorDrawable的值设置为"@null""@null" 作用是让光标颜色和文本颜色保持一致。

光标显示与隐藏

设置android:cursorVisible即可

1
2
3
android:cursorVisible="true" 显示光标

android:cursorVisible="false" 隐藏光标

设置光标位置

EditText 如果有默认输入,光标获取焦点后,默认插入光标是在第一个位置的。用户体验不是很好,为了方便用户使用,需要把光标移动到最后位置,可以使用 setSelection 方法完成。如下例子:

1
2
3
4
EditText et = ... 
String text = "text";
et.setText(text);
et.setSelection(text.length());

取消EditText下划线

可以通过背景属性设置,取消下划线。android:background="@null",这样操作会使的下划线消失的同时,默认边距也不存在。需要重新处理边距问题。

自定义style样式修改下划线光标颜色

使用android:theme="@style/MyEditText"属性设置自定义主题。如下,需要先创建自己的style样式,然后使用属性设置。

1
2
3
4
5
6
<!--colorControlNormal 为没有获取焦点时候下划线的颜色-->
<!--colorControlActivated 为获取焦点时候光标与下划线的颜色-->
<style name="MyEditText" parent="Theme.AppCompat.Light">
<item name="colorControlNormal">@color/colorPrimary</item>
<item name="colorControlActivated">@android:color/holo_orange_dark</item>
</style>

参考博客