以编程方式更改Android EditText光标指针颜色

10

所以,我已经搜了很多但都找不到答案。如果这是一个重复的问题,我很抱歉,但我想改变EditText的光标指针颜色,用于移动光标。

enter image description here

我已经成功地改变了光标本身的颜色,但它不影响指针,似乎只有accentColor才能影响它。

我很确定这是可能的,因为我记得看到一个应用程序做到了这一点,它可以根据你选择的颜色更改对话框中的指针和所有元素的颜色,而不更改对话框下面视图的accent color。

请帮忙 :)


1
正如您所说,我认为您可以通过更改accentColor来更改此颜色。 - Chol
是的,但更改强调颜色也会更改与强调颜色硬连线的底层元素的颜色。 - alessandro gaboardi
也许您可以为此编辑文本创建自定义主题,并根据需要设置accentColor。 - Chol
我没有考虑到这一点,稍后我会尝试并让您知道。您知道有没有一种编程方式可以动态更改主题的强调色吗? - alessandro gaboardi
可以查看这个链接:https://dev59.com/HV8e5IYBdhLWcg3wyM_N ,但似乎并不像只需要在styles.xml中添加几行代码那么简单 :) - Chol
我最终尝试了一下,主题可以工作,但是在程序上进行编程更改太复杂了,所以不值得。 - alessandro gaboardi
5个回答

7
您可以为此EditText创建自己的样式/主题并更改ColorAccent:
<style name="EditTextColorCustom" parent="@style/AppBaseTheme">
        <!-- Customize your theme here. -->
        <item name="colorAccent">@color/colorAccent</item>
    </style>

4
您可以通过在style.xml中创建新样式来实现此操作。具体方法如下:
<style name="CustomEditTextTheme" parent="TextAppearance.AppCompat">
    <item name="colorAccent">@color/primary_dark_material_dark</item>       
</style>

然后在EditText标签中使用以下内容:
style="@style/CustomEditTextTheme"

3
我用android:theme="@style/CustomEditTextTheme"代替了style=... - CoolMind
如果 colorAccent 无效,请改用以下代码: <item name="colorControlActivated">@color/primary_dark_material_dark</item> - daisura99

2
你可以在style的AppTheme中添加colorControlActivated来改变颜色: <item name="colorControlActivated">"你的颜色"</item> "Original Answer"翻译成"最初的回答"

这个实际上可以工作...但我认为它会覆盖颜色强调设置。 - daisura99

2
你可以使用反射来设置selectHandle。
EditText有一个Editor类,其中包含mSelectHandleCenter字段(如果需要选择,请使用mSelectHandleLeft和mSelectHandleRight)。
private fun setCursorPointerColor(view: EditText, @ColorInt color: Int) {
    try {
        //get the pointer resource id
        var field = TextView::class.java.getDeclaredField("mTextSelectHandleRes")
        field.isAccessible = true
        val drawableResId = field.getInt(view)

        //get the editor
        field = TextView::class.java.getDeclaredField("mEditor")
        field.isAccessible = true
        val editor = field.get(view)

        //tint drawable
        val drawable = ContextCompat.getDrawable(view.context, drawableResId)!!
        drawable.setColorFilter(color, PorterDuff.Mode.SRC_IN)

        //set the drawable
        field = editor.javaClass.getDeclaredField("mSelectHandleCenter")
        field.isAccessible = true
        field.set(editor, drawable)

    } catch (ex: Exception) {
    }
}

2
您可以使用textSelectHandle将其替换为您的可绘制对象,像这样:
android:textSelectHandle="@drawable/your_drawble"

没有一个建议的变体适用于我的TextInputEditText或AppCompatAutoCompleteTextView,只有这一个。我使用了Android Studio图标中的"invert_colors"向量。 - djdance

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接