当前位置: 首页 > 知识库问答 >
问题:

使用反射法设置文本光标颜色

富勇军
2023-03-14

我一直在使用反射方法以编程方式设置我的EditText的光标颜色,这是我从这个答案中找到的(我也尝试了这个答案)。然而,在最近的一些更新之后,我不记得确切的时间了,这种方法不再有效,我假设Android可能已经改变了TextView类中的某些内容。不管怎样,有人能帮我吗?现在是否有新的字段名用于mCursorDrawablemCursorDrawable,或者整个方法无效,需要现在以另一种方式实现?

更新:我刚刚发现这个方法只在AndroidP上停止工作,在以前的版本上,它仍然有效。

更新2:我自己解决了问题,如果你也卡住了,请检查答案。

共有2个答案

康赞
2023-03-14

不幸的是,即使在兼容库中,Google也没有将xml属性公开给tint,或者为这些属性设置drawables的方法,所以目前动态设置它们的唯一方法是通过如上所述的反射。

但是,您可以在xml中设置可绘制内容,如果您只想为现有的材质设计可绘制内容着色,可以通过为文本选择句柄的xml着色来实现,因为它们是位图可绘制内容,但是光标可绘制内容是一个插入可绘制内容,因此必须从源代码中重新创建。

所使用的可抽出物包括:

R.drawable.abc_text_select_handle_left_mtrl_light
R.drawable.abc_text_select_handle_middle_mtrl_light
R.drawable.abc_text_select_handle_right_mtrl_light
R.drawable.abc_text_cursor_material

您可以创建文本的着色版本,如下所示:

<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/abc_text_select_handle_left_mtrl_light"
    android:tint="@color/my_text_select_handle_color" />

<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/abc_text_select_handle_middle_mtrl_light"
    android:tint="@color/my_text_select_handle_color" />

<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/abc_text_select_handle_right_mtrl_light"
    android:tint="@color/my_text_select_handle_color" />

可以从源代码中重新创建光标可绘制,如下所示:

<inset xmlns:android="http://schemas.android.com/apk/res/android"
       android:inset="2dp">
  <shape
      android:tint="@color/my_text_cursor_color"
      android:shape="rectangle">
    <size
        android:height="2dp"
        android:width="2dp" />
    <solid
        android:color="@color/white" />
  </shape>
</inset>

将它们放在drawables文件夹中,并在AppCompatiEditText xml定义中引用它们,使用:

android:textCursorDrawable
android:textSelectHandle
android:textSelectHandleLeft
android:textSelectHandleRight

瞧,自定义颜色的光标和选择手柄与默认材质设计版本完全匹配,避免反射,因此不会导致警告或错误。

经俊茂
2023-03-14

好的,在深入研究Android Pie源代码后,我发现Google已经将mCursorDrawable更改为mdraawableForCursor,并且还将其类型从两元素Drawable数组更改为简单的Drawable,因此我在原始反射方法的基础上做了一些更改,现在它适用于Android P:

public static void setEditTextCursorColor(EditText editText, int color) {
    try {
        // Get the cursor resource id
        Field field = TextView.class.getDeclaredField("mCursorDrawableRes");
        field.setAccessible(true);
        int drawableResId = field.getInt(editText);

        // Get the editor
        field = TextView.class.getDeclaredField("mEditor");
        field.setAccessible(true);
        Object editor = field.get(editText);

        // Get the drawable and set a color filter
        Drawable drawable = ContextCompat.getDrawable(editText.getContext(), drawableResId);
        drawable.setColorFilter(color, PorterDuff.Mode.SRC_IN);

        // Set the drawables
        if(Build.VERSION.SDK_INT >= 28){//set differently in Android P (API 28)
            field = editor.getClass().getDeclaredField("mDrawableForCursor");
            field.setAccessible(true);
            field.set(editor, drawable);
        }else {
            Drawable[] drawables = {drawable, drawable};
            field = editor.getClass().getDeclaredField("mCursorDrawable");
            field.setAccessible(true);
            field.set(editor, drawables);
        }

        //optionally set the "selection handle" color too
        setEditTextHandleColor(editText, color);
    } catch (Exception ignored) {}
}

顺便说一句,我真的希望谷歌能添加一个像setCursorDrawable()之类的公共方法,那样会容易得多。

 类似资料:
  • 通过RGB值设置光晕的颜色。 光晕的默认颜色是 0xFFFFFF: // 颜色的参数可以是字符串 "#FF0000" 或者是十六进制数值 0xFF0000 controller.setHaloColor("#FF0000"); //controller.setHaloColor(0xFF0000);

  • 问题内容: 如何使用jQuery在文本字段中设置光标位置?我有一个带有内容的文本字段,我希望用户将光标放在该字段上时将光标定位在某个偏移处。该代码应该看起来像这样: 该setCursorPosition函数的实现是什么样的?如果您的文本字段的内容为abcdefg,则此调用将导致光标的定位如下:abcd | efg。 Java具有类似的功能setCaretPosition。javascript是否存

  • 本文向大家介绍javascript设置文本框光标的方法实例小结,包括了javascript设置文本框光标的方法实例小结的使用技巧和注意事项,需要的朋友参考一下 本文实例总结了javascript设置文本框光标的方法。分享给大家供大家参考,具体如下: 对于text 对于textarea 设置光标函数 更多关于JavaScript相关内容感兴趣的读者可查看本站专题:《JavaScript查找算法技巧总

  • 问题内容: 我正在与一个非开源项目合作,我需要修改一个或多个其类。 在一个类中是以下集合: 我需要做的就是在这里使用反射和并发hashmap。我试过下面的代码,但是不起作用。 问题答案: 希望这是您要尝试做的事情: 它打印:

  • 我有一个浅色主题但深色动作栏的应用程序。所以我的颜色控制激活是我的主色(绿色),在浅色背景下,编辑文本光标是绿色的。问题是我的动作栏是绿色的,所以当在动作栏中使用搜索文本时,我看不到光标,因为它是相同的颜色。我如何仅在动作栏中将光标颜色更改为白色?

  • 问题内容: 如何为网页中的鼠标光标分配颜色? 谁能建议我使用HTML,CSS,JavaScript等任何技术来做到这一点的方法? 问题答案: 将图片与CSS 属性一起使用,我看不到需要JavaScript继承人… 如前所述,我只使用了其中的一种,只是以防万一您的图像无法加载,就像我们声明了多个字体系列一样。