java - Android 以编程方式设置textcursordrawable,无需反射方法

标签 java android android-edittext cursor

我想根据所选的应用主题以编程方式更改项目中使用的所有编辑文本的 EditText 颜色和宽度。
因此我无法使用 XML 来完成此操作,需要一个编程解决方案。

所以我想创建一个自定义函数来设置它

void setEditTextColorDrawable(int ClrVar)
{
    // Code Todo 
}

我尝试了
中建议的所有方法 set textCursorDrawable programmatically

问题是,getDeclaredField("mCursorDrawableRes") 在 API22 以上不可用。
那么我该如何为所有 API(甚至高于 22)执行此操作

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)
{
    log.d("TAG", "This is depricated")
}

Output : "This is depricated"

最佳答案

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) {
        ignored.getMessage();
    }
}

如果你想改变水滴颜色,可以使用以下代码: https://gist.github.com/jaredrummler/2317620559d10ac39b8218a1152ec9d4

关于java - Android 以编程方式设置textcursordrawable,无需反射方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45766185/

相关文章:

java - 从 Java 启动子进程,它不会继承 UNIX 上的文件/端口

java - 如何将 JUnitPerf 与 JWebUnit 和 JUnit 4 一起使用?

android - 如何在 .apk 安装时在 android 上运行进程

android - edittext专注于android中的可见

android - 检测 EditText 的内容是由用户更改还是以编程方式更改?

java - 一旦 JVM 存在,守护线程会发生什么?

java - 如何将列表从 Controller 发送到thymeleaf

android - 如何从 FFTBasedSpectrumAnalyzer 项目中只获取音频和分频?

java - 显示当前日期时出错

Android:在 AlertDialog Box 中设置编辑文本的边距