android - 以编程方式设置 textCursorDrawable

标签 android android-edittext

如果我在 XML 中添加 EditText 我可以设置 textCursorDrawable="@null":

<EditText
    android:id="@+id/txtE3Casecode4"
    android:layout_width="30dp"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:background="#C7C7C5"
    android:textCursorDrawable="@null"
    android:ems="10"
    android:inputType="number"
    android:maxLength="2"
    android:text="01"
    android:textColor="#000000" />

现在我用 Java 绘制一个 EditText。我想设置 android:textCursorDrawable="@null".

LinearLayout.LayoutParams paramtext = new LinearLayout.LayoutParams(
    LinearLayout.LayoutParams.FILL_PARENT,
    LinearLayout.LayoutParams.WRAP_CONTENT);
EditText txtOther = new EditText(this);
txtOther.setLayoutParams(paramtext);
txtOther.setBackgroundColor(Color.WHITE);
txtOther.setTextColor(Color.BLACK);
txtOther.setId(99999);
// txtOther.setCursorDrawable ?                                

如何设置?

最佳答案

2019 年更新:没有设置可绘制光标的公共(public) API。https://stackoverflow.com/a/57555148/253468对于 29 及更高版本上可用的 API,在此之前,您需要有条件地使用反射,如下所述。

在 API 29 之前,您可以使用反射以编程方式设置它。 mCursorDrawableRes 字段没有更改,因此这应该适用于所有设备,除非制造商更改了某些内容或稍后更改。

使用反射设置光标:

EditText yourEditText = new EditText(context);

...

try {
    // https://github.com/android/platform_frameworks_base/blob/kitkat-release/core/java/android/widget/TextView.java#L562-564
    Field f = TextView.class.getDeclaredField("mCursorDrawableRes");
    f.setAccessible(true);
    f.set(yourEditText, R.drawable.cursor);
} catch (Exception ignored) {
}

在你的应用中定义一个可绘制的光标:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >
    
    <solid android:color="#ff000000" />
    
    <size android:width="1dp" />
    
</shape>

另一种方法:

您也可以通过以下方法设置光标颜色:

public static void setCursorDrawableColor(EditText editText, int color) {
    try { 
        Field fCursorDrawableRes = TextView.class.getDeclaredField("mCursorDrawableRes");
        fCursorDrawableRes.setAccessible(true);
        int mCursorDrawableRes = fCursorDrawableRes.getInt(editText);
        Field fEditor = TextView.class.getDeclaredField("mEditor");
        fEditor.setAccessible(true);
        Object editor = fEditor.get(editText);
        Class<?> clazz = editor.getClass();
        Field fCursorDrawable = clazz.getDeclaredField("mCursorDrawable");
        fCursorDrawable.setAccessible(true);
        Drawable[] drawables = new Drawable[2];
        drawables[0] = editText.getContext().getResources().getDrawable(mCursorDrawableRes);
        drawables[1] = editText.getContext().getResources().getDrawable(mCursorDrawableRes);
        drawables[0].setColorFilter(color, PorterDuff.Mode.SRC_IN);
        drawables[1].setColorFilter(color, PorterDuff.Mode.SRC_IN);
        fCursorDrawable.set(editor, drawables);
    } catch (Throwable ignored) {
    } 
} 

关于android - 以编程方式设置 textCursorDrawable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11554078/

相关文章:

android - 如何临时释放相机?

android - OutOfMemory 异常 - 对于 adapter.notifiyDataSetChanged() 在使用 picasso 加载图像时

android - Appium getText() 返回 android :hint value from EditText?

java - 如何编辑 Android View 项内的文本(内容)

android - 如果编辑文本已填充输入,请更改其下划线颜色?

android - 在检索联系电话时使用 getColumnIndex() 获取 -1 - Android

java - 位图不缩放到高度 Android

java - Android以编程方式获取edittext文本

TextView 上的 android 阴影层无法正常工作 5.0

java - 每次检测到某个字符串时尝试清除 TextWatcher 并继续读取 EditText