Android 通过 xml 和 Java 两种方式调整 EditText 光标样式

      小菜有个小需求是根据主题配色更改 EditText 中输入框光标的颜色,网上查了一些资料,大部分都是直接用的 xml 方式在做调整,但是小菜需要的是在 Java 代码中动态调整光标颜色。
      虽然是一个很简单的东西,但是小菜在测试中还是遇到了不少的小问题,现在简单整理一下,希望对于遇到相同问题的朋友有所帮助。


小菜的测试步骤如下:

  1. 设置一个默认的 EditText,默认光标颜色为程序对应的 colorPrimary 颜色值;
<EditText
    android:id="@+id/test_et1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="18dp"
    android:background="@null"
    android:hint="默认光标颜色,色值 #13B7F6" />
  1. 设置一个 EditText,通过更改 xml 方式调整光标颜色,其中 android:textCursorDrawable 属性来设置 shape 光标样式,shape 中 size 设置光标宽度,solid 设置光标颜色;
<EditText
    android:id="@+id/test_et2"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="18dp"
    android:background="@null"
    android:hint="xml 设置光标颜色,色值 #F54343"
    android:textCursorDrawable="@drawable/editext_cursor" />
<?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="@color/red" />
</shape>
  1. 设置一个 EditText,期望通过 Java 方式调整光标颜色,但是设置失败;
<EditText
    android:id="@+id/test_et3"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="18dp"
    android:background="@null"
    android:hint="Java 设置光标颜色(不正常)为灰色"
    android:textCursorDrawable="@null" />
GradientDrawable myGrad2 = new GradientDrawable();
myGrad2.setColor(getResources().getColor(R.color.cmbkb_limit_buy_green));
myGrad2.setSize(4, 40);

try {
    Field f = TextView.class.getDeclaredField("mCursorDrawableRes");
    f.setAccessible(true);

    f.set(et3, myGrad2);
} catch (Exception ignored) {
    // TODO: handle exception
}


Tips: 造成失败的原因有两个,第一个不可设置 android:textCursorDrawable="@null",这样光标颜色默认是根据字体颜色一致;第二个是不可以设置 new GradientDrawable(),并不能直接调整光标颜色。

  1. 设置一个 EditText,通过 Java 方式调整光标颜色,此效果为小菜期待的效果,将上个步骤中 Tips 方式调整即可;
<EditText
    android:id="@+id/test_et4"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="18dp"
    android:background="@null"
    android:hint="Java 设置光标颜色(正常),色值 #00CC00"
    android:textCursorDrawable="@drawable/editext_cursor" />
GradientDrawable myGrad1 = (GradientDrawable) getResources().getDrawable(R.drawable.editext_cursor);
myGrad1.setColor(getResources().getColor(R.color.cmbkb_limit_buy_green));
myGrad1.setSize(4, 20);

try {
    Field f = TextView.class.getDeclaredField("mCursorDrawableRes");
    f.setAccessible(true);

    f.set(et4, myGrad1);
} catch (Exception ignored) {
    // TODO: handle exception
}


Tips: 小菜在测试过程中发现,需要在 EditText xml 中默认设置一个 android:textCursorDrawable="@drawable/editext_cursor" 样式,之后在 Java 代码动态修改光标颜色和宽度。

  1. 添加一个测试 EditText,Java 动态修改光标宽度,仅需调整 size 属性即可;
GradientDrawable myGrad2 = (GradientDrawable) getResources().getDrawable(R.drawable.editext_cursor);
myGrad2.setColor(getResources().getColor(R.color.cmbkb_limit_buy_green));
myGrad2.setSize(15, 40);

Tips: 小菜在测试时发现,一旦用上述方式调整光标颜色,同一个页面中所有的 EditText 光标样式,会以最后一次设置的为准。


      很多看起来很细小的问题有时候也很值得研究;

来源: 阿策小和尚

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,045评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,114评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,120评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,902评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,828评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,132评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,590评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,258评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,408评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,335评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,385评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,068评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,660评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,747评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,967评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,406评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,970评论 2 341

推荐阅读更多精彩内容

  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,335评论 0 17
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,279评论 25 707
  • 引言 EditTex是Android中比较常用的一个控件,可以说它是用户和Android应用进行数据传递的通道.通...
    OzanShareing阅读 6,166评论 5 33
  • 十年前的某一个午后,你在慵懒的阳光中所幻想的,是否是今天的场景? 其实用不上十年这么长的时间。六年前的一个下午...
    小律管海鑫阅读 286评论 0 1
  • 醒来,她已偷偷跑到我还未褪去热气的被褥里,就躺在我怀里,把她的面容展露在我的鼻息前.,我用感官慢慢将她描述,这个陌...
    碧落_7113阅读 262评论 0 0