??????小菜有個(gè)小需求是根據(jù)主題配色更改 EditText 中輸入框光標(biāo)的顏色,網(wǎng)上查了一些資料节视,大部分都是直接用的 xml 方式在做調(diào)整,但是小菜需要的是在 Java 代碼中動(dòng)態(tài)調(diào)整光標(biāo)顏色假栓。
??????雖然是一個(gè)很簡單的東西寻行,但是小菜在測試中還是遇到了不少的小問題,現(xiàn)在簡單整理一下匾荆,希望對于遇到相同問題的朋友有所幫助拌蜘。
小菜的測試步驟如下:
- 設(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" />
- 設(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>
- 設(shè)置一個(gè) EditText构罗,期望通過 Java 方式調(diào)整光標(biāo)顏色铜涉,但是設(shè)置失敗绰播;
<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)顏色。
- 設(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: 小菜在測試過程中發(fā)現(xiàn)陪蜻,需要在 EditText xml 中默認(rèn)設(shè)置一個(gè) android:textCursorDrawable="@drawable/editext_cursor" 樣式,之后在 Java 代碼動(dòng)態(tài)修改光標(biāo)顏色和寬度贱鼻。
- 添加一個(gè)測試 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: 小菜在測試時(shí)發(fā)現(xiàn)症昏,一旦用上述方式調(diào)整光標(biāo)顏色,同一個(gè)頁面中所有的 EditText 光標(biāo)樣式父丰,會以最后一次設(shè)置的為準(zhǔn)肝谭。
??????很多看起來很細(xì)小的問題有時(shí)候也很值得研究;
來源: 阿策小和尚