Android 通過 xml 和 Java 兩種方式調(diào)整 EditText 光標(biāo)樣式

??????小菜有個(gè)小需求是根據(jù)主題配色更改 EditText 中輸入框光標(biāo)的顏色,網(wǎng)上查了一些資料,大部分都是直接用的 xml 方式在做調(diào)整,但是小菜需要的是在 Java 代碼中動(dòng)態(tài)調(diào)整光標(biāo)顏色。
??????雖然是一個(gè)很簡單的東西,但是小菜在測(cè)試中還是遇到了不少的小問題,現(xiàn)在簡單整理一下,希望對(duì)于遇到相同問題的朋友有所幫助。


小菜的測(cè)試步驟如下:

  1. 設(shè)置一個(gè)默認(rèn)的 EditText,默認(rèn)光標(biāo)顏色為程序?qū)?yīng)的 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="默認(rèn)光標(biāo)顏色,色值 #13B7F6" />
  1. 設(shè)置一個(gè) EditText,通過更改 xml 方式調(diào)整光標(biāo)顏色,其中 android:textCursorDrawable 屬性來設(shè)置 shape 光標(biāo)樣式,shape 中 size 設(shè)置光標(biāo)寬度,solid 設(shè)置光標(biāo)顏色;
<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 設(shè)置光標(biāo)顏色,色值 #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. 設(shè)置一個(gè) EditText,期望通過 Java 方式調(diào)整光標(biāo)顏色,但是設(shè)置失?。?/li>
<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 設(shè)置光標(biāo)顏色(不正常)為灰色"
    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: 造成失敗的原因有兩個(gè),第一個(gè)不可設(shè)置 android:textCursorDrawable="@null",這樣光標(biāo)顏色默認(rèn)是根據(jù)字體顏色一致;第二個(gè)是不可以設(shè)置 new GradientDrawable(),并不能直接調(diào)整光標(biāo)顏色。

  1. 設(shè)置一個(gè) EditText,通過 Java 方式調(diào)整光標(biāo)顏色,此效果為小菜期待的效果,將上個(gè)步驟中 Tips 方式調(diào)整即可;
<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 設(shè)置光標(biāo)顏色(正常),色值 #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: 小菜在測(cè)試過程中發(fā)現(xiàn),需要在 EditText xml 中默認(rèn)設(shè)置一個(gè) android:textCursorDrawable="@drawable/editext_cursor" 樣式,之后在 Java 代碼動(dòng)態(tài)修改光標(biāo)顏色和寬度。

  1. 添加一個(gè)測(cè)試 EditText,Java 動(dòng)態(tài)修改光標(biāo)寬度,僅需調(diào)整 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: 小菜在測(cè)試時(shí)發(fā)現(xiàn),一旦用上述方式調(diào)整光標(biāo)顏色,同一個(gè)頁面中所有的 EditText 光標(biāo)樣式,會(huì)以最后一次設(shè)置的為準(zhǔn)。


??????很多看起來很細(xì)小的問題有時(shí)候也很值得研究;

來源: 阿策小和尚

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • ¥開啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個(gè)線程,因...
    小菜c閱讀 7,334評(píng)論 0 17
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,045評(píng)論 25 709
  • 引言 EditTex是Android中比較常用的一個(gè)控件,可以說它是用戶和Android應(yīng)用進(jìn)行數(shù)據(jù)傳遞的通道.通...
    OzanShareing閱讀 6,624評(píng)論 5 33
  • 十年前的某一個(gè)午后,你在慵懶的陽光中所幻想的,是否是今天的場(chǎng)景? 其實(shí)用不上十年這么長的時(shí)間。六年前的一個(gè)下午...
    小律管海鑫閱讀 332評(píng)論 0 1
  • 醒來,她已偷偷跑到我還未褪去熱氣的被褥里,就躺在我懷里,把她的面容展露在我的鼻息前.,我用感官慢慢將她描述,這個(gè)陌...
    碧落_7113閱讀 287評(píng)論 0 0

友情鏈接更多精彩內(nèi)容