关于android:设置EditText游标颜色

Set EditText cursor color

我有这个问题,我在平板电脑项目中使用Android的Holo主题。 但是,我在屏幕上有一个具有白色背景的片段。 我在这个片段上添加了一个EditText组件。 我试图通过设置Holo.Light主题资源的背景来覆盖主题。 但是,我的文本光标(克拉)仍然是白色的,因此在屏幕上看不见(我可以在编辑文本字段中隐约发现它...)。

有谁知道如何让EditText使用更暗的光标颜色? 我已经尝试将EditText的样式设置为"@android:style/Widget.Holo.Light.EditText"而没有正面结果。


android:textCursorDrawable属性设置为@null应导致使用android:textColor作为光标颜色。

属性"textCursorDrawable"在API级别12及更高级别中可用


在布局中

1
2
3
4
5
<EditText  
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textCursorDrawable="@drawable/color_cursor"
    />

然后创建drawable xml:color_cursor

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

EditText属性上有一个白色光标。


似乎所有的答案都围绕着灌木丛。

EditText中,使用属性:

1
android:textCursorDrawable="@drawable/black_cursor"

并将drawable black_cursor.xml添加到您的资源,如下所示:

1
2
3
4
5
<?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="#000000"/>
</shape>

如果需要,这也是创建更多样化游标的方法。


在最新的Appcompact v21中有一种更改光标颜色的新方法
只需像这样更改colorAccent样式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
 <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Set theme colors from http://www.google.com/design/spec/style/color.html#color-color-palette-->

    <!-- colorPrimary is used for the default action bar background -->
    <item name="colorPrimary">#088FC9</item>

    <!-- colorPrimaryDark is used for the status bar -->
    <item name="colorPrimaryDark">#088FC9</item>

    <!-- colorAccent is used as the default value for colorControlActivated
         which is used to tint widgets -->
    <!-- THIS IS WHAT YOU'RE LOOKING FOR -->
    <item name="colorAccent">#0091BC</item>
</style>

然后在您的应用主题或活动上应用此样式。

更新:这种方式仅适用于API 21+
更新2:我不确定它可以工作的最低Android版本。经Android版测试:

1
2
3
4
2.3.7 - didn't work
4.4.4 - worked
5.0 - worked
5.1 - worked


我找到了答案:)

我将Theme的editText样式设置为:

1
<item name="android:editTextStyle">@style/myEditText</item>

然后我使用以下drawable来设置光标:

`

1
2
3
4
5
<style name="myEditText" parent="@android:style/Widget.Holo.Light.EditText">
    <item name="android:background">@android:drawable/editbox_background_normal</item>
    <item name="android:textCursorDrawable">@android:drawable/my_cursor_drawable</item>
    <item name="android:height">40sp</item>
</style>

`

android:textCursorDrawable是这里的关键。


对于需要动态设置EditText光标颜色的任何人,您将在下面找到两种方法来实现此目的。

首先,创建你的光标drawable:

1
2
3
4
5
6
7
8
9
<?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>

将光标drawable资源id设置为您创建的drawable(https://github.com/android/platform_frameworks_base/blob/kitkat-release/core/java/android/widget/TextView.java#L562-564">source)) :

1
2
3
4
5
6
try {
    Field f = TextView.class.getDeclaredField("mCursorDrawableRes");
    f.setAccessible(true);
    f.set(yourEditText, R.drawable.cursor);
} catch (Exception ignored) {
}

要仅更改默认光标drawable的颜色,可以使用以下方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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];
        Resources res = editText.getContext().getResources();
        drawables[0] = res.getDrawable(mCursorDrawableRes);
        drawables[1] = res.getDrawable(mCursorDrawableRes);
        drawables[0].setColorFilter(color, PorterDuff.Mode.SRC_IN);
        drawables[1].setColorFilter(color, PorterDuff.Mode.SRC_IN);
        fCursorDrawable.set(editor, drawables);
    } catch (final Throwable ignored) {
    }
}


晚了,这是我的回答,

这适用于那些不想在父主题中更改colorAccent但想要更改EditText属性的人!

This answer demos how to change ......

  • Bottom line color
  • Cursor color
  • Cursor pointer color (I used my custom image).......... of EditText using style applied to the Activity theme.
  • enter image description here

    1
    2
    3
    4
    <android.support.v7.widget.AppCompatEditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Hey" />

    例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    <style name="AppTheme.EditText" parent="@style/Widget.AppCompat.EditText">
        <item name="android:textColor">@color/white</item>
        <item name="android:textColorHint">#8AFFFFFF</item>
        <item name="android:background">@drawable/edit_text_background</item> // background (bottom line at this case)
        <item name="android:textCursorDrawable">@color/white</item>  // Cursor
        <item name="android:textSelectHandle">@drawable/my_white_icon</item> // For pointer normal state and copy text state
        <item name="android:textSelectHandleLeft">@drawable/my_white_icon</item>
        <item name="android:textSelectHandleRight">@drawable/my_white_icon</item>
    </style>

    现在创建一个drawable(edit_text_background)为后台添加资源xml!您可以根据需要自定义!

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <?xml version="1.0" encoding="utf-8"?>
    <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
        <item
            android:bottom="0dp"
            android:left="-3dp"  
            android:right="-3dp"
            android:top="-3dp">

            <shape android:shape="rectangle">
                <stroke
                    android:width="1dp"
                    android:color="@color/white"/>
            </shape>
        </item>
        </layer-list>

    现在,您已在Activity主题中设置此样式。

    示例:

    在您的活动中,您有一个主题,将此自定义EditText主题设置为该主题。

    1
    2
    3
    4
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Your Theme data -->
        <item name="editTextStyle">@style/AppTheme.EditText</item> // inculude this
    </style>


    1
    2
    3
    4
    5
    6
    Edittext cursor color you want changes your color.
       <EditText  
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:textCursorDrawable="@drawable/color_cursor"
        />

    然后创建drawalble xml:color_cursor

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

    对我来说,我修改了AppTheme和值colors.xml

    1
    2
    3
    4
    5
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorControlNormal">@color/yellow</item>
        <item name="colorAccent">@color/yellow</item>
    </style>

    这是colors.xml

    1
    2
    3
    4
    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <color name="yellow">#B7EC2A</color>
    </resources>

    我将android:textCursorDrawable属性取出到@null,我放在editText样式中。当我尝试使用它时,颜色不会改变。


    哇我这个派对真的很晚了,但它已经在17天前开展了活动
    我们需要考虑发布我们正在使用的Android版本以获得答案,因此现在这个答案适用于Android 2.1及更高版本
    转到RES / VALUES / STYLES并在下面添加代码行,光标将为黑色

    1
    2
    3
    4
    5
    6
        <style name="AppTheme" parent="Theme.AppCompat.NoActionBar">
        <!--<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">-->
        <!-- Customize your theme here. -->
        <item name="colorControlActivated">@color/color_Black</item>
        <!--Sets COLOR for the Cursor in EditText  -->
    </style>

    在RES / COLOR文件夹中需要这行代码

    1
    <color name="color_Black">#000000</color>

    为什么这么晚发帖?对于许多头脑怪物Android来说,考虑某种形式的类别可能会很好!


    @Jared Rummler的编程setCursorDrawableColor()版本适用于Android 9 Pie。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    @SuppressWarnings({"JavaReflectionMemberAccess","deprecation"})
    public static void setCursorDrawableColor(EditText editText, int color) {

        try {
            Field cursorDrawableResField = TextView.class.getDeclaredField("mCursorDrawableRes");
            cursorDrawableResField.setAccessible(true);
            int cursorDrawableRes = cursorDrawableResField.getInt(editText);
            Field editorField = TextView.class.getDeclaredField("mEditor");
            editorField.setAccessible(true);
            Object editor = editorField.get(editText);
            Class< ? > clazz = editor.getClass();
            Resources res = editText.getContext().getResources();
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
                Field drawableForCursorField = clazz.getDeclaredField("mDrawableForCursor");
                drawableForCursorField.setAccessible(true);
                Drawable drawable = res.getDrawable(cursorDrawableRes);
                drawable.setColorFilter(color, PorterDuff.Mode.SRC_IN);
                drawableForCursorField.set(editor, drawable);
            } else {
                Field cursorDrawableField = clazz.getDeclaredField("mCursorDrawable");
                cursorDrawableField.setAccessible(true);
                Drawable[] drawables = new Drawable[2];
                drawables[0] = res.getDrawable(cursorDrawableRes);
                drawables[1] = res.getDrawable(cursorDrawableRes);
                drawables[0].setColorFilter(color, PorterDuff.Mode.SRC_IN);
                drawables[1].setColorFilter(color, PorterDuff.Mode.SRC_IN);
                cursorDrawableField.set(editor, drawables);
            }
        } catch (Throwable t) {
            Log.w(TAG, t);
        }
    }


    editcolor.xml

    android:textCursorDrawable="@drawable/editcolor"

    在xml文件中设置EditText背景颜色的颜色代码


    唯一有效的答案应该是改变活动的主题:
    #000000
    您不应该使用android:textCursorDrawable@null,因为如果您想拖动光标,这只涉及光标本身而不是光标下方的引脚。主题解决方案是最严重的解决方案。


    另一个简单的解决方案是转到项目文件夹中的res> values> colors.xml,并将颜色重点的值编辑为您喜欢的颜色

    1
    <color name="colorAccent">#000000</color>

    上面的代码将光标更改为黑色。


    用这个

    机器人:textCursorDrawable ="@色/白色"


    它比这更容易。

    1
    2
    3
    <style name="MyTextStyle">
        <item name="android:textCursorDrawable">#000000</item>
    </style>

    这适用于ICS及更高版本。我没有在其他版本中测试它。


    你想要特定的颜色你必须使用AppCompatEditText然后backround设置null

    适合我

    1
    2
    3
    <android.support.v7.widget.AppCompatEditText
        android:background="@null"
        android:textCursorDrawable="@color/cursorColor"/>

    看到这个要点


    这在Android中被称为colorAccent

    转到res - > values - > styles.xml add

    1
    <item name="colorAccent">#FFFFFF</item>

    如果不存在


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">#36f0ff</item>
        <item name="colorPrimaryDark">#007781</item>
        <item name="colorAccent">#000</item>
    </style>

    <style name="AppTheme.NoActionBar">
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
    </style>

    <style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" />

    <style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" />

    在styles.xm中改变colorAccent的颜色,这很简单