Set EditText cursor color

2018-12-31 17:37发布

问题:

I am having this issue where I am using the Android\'s Holo theme on a tablet project. However, I have a fragment on screen which has a white background. I am adding an EditText component on this fragment. I\'ve tried to override the theme by setting the background of the Holo.Light theme resources. However, my text cursor (carat) remains white and hence, invisible on screen (I can spot it faintly in the edittext field..).

Does anyone know how I can get EditText to use a darker cursor color? I\'ve tried setting the style of the EditText to \"@android:style/Widget.Holo.Light.EditText\" with no positive result.

回答1:

Setting the android:textCursorDrawable attribute to @null should result in the use of android:textColor as the cursor color.

Attribute \"textCursorDrawable\" is available in API level 12 and higher



回答2:

In Layout

<EditText  
    android:layout_width=\"match_parent\" 
    android:layout_height=\"wrap_content\" 
    android:textCursorDrawable=\"@drawable/color_cursor\"
    />

Then create drawable xml: color_cursor

<?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>

You have a white color cursor on EditText property.



回答3:

It appears as if all the answers go around the bushes.

In your EditText, use the property:

android:textCursorDrawable=\"@drawable/black_cursor\"

and add the drawable black_cursor.xml to your resources, as follows:

<?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>

This is also the way to create more diverse cursors, if you need.



回答4:

There is a new way to change cursor color in latest Appcompact v21
Just change colorAccent in style like this:

 <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>

Then apply this style on your app theme or activities.

Update: this way only works on API 21+
Update 2: I\'m not sure the minimum android version that it can work.
Tested by android version:

2.3.7 - didn\'t work
4.4.4 - worked
5.0 - worked
5.1 - worked


回答5:

I found the answer :)

I\'ve set the Theme\'s editText style to:

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

Then I\'ve used the following drawable to set the cursor:

`

<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 is the key here.



回答6:

For anyone that needs to set the EditText cursor color dynamically, below you will find two ways to achieve this.


First, create your cursor drawable:

<?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>

Set the cursor drawable resource id to the drawable you created (https://github.com/android/platform_frameworks_base/blob/kitkat-release/core/java/android/widget/TextView.java#L562-564\">source)):

try {
    Field f = TextView.class.getDeclaredField(\"mCursorDrawableRes\");
    f.setAccessible(true);
    f.set(yourEditText, R.drawable.cursor);
} catch (Exception ignored) {
}

To just change the color of the default cursor drawable, you can use the following method:

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) {
    }
}


回答7:

Late to the party,Here\'s is my answer,

This is for the people who are not looking to change the colorAccent in their parent theme,but wants to change EditText attributes!

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

  1. Bottom line color
  2. Cursor color
  3. Cursor pointer color (I used my custom image).......... of EditText using style applied to the Activity theme.

\"enter

<android.support.v7.widget.AppCompatEditText
    android:layout_width=\"match_parent\"
    android:layout_height=\"wrap_content\"
    android:text=\"Hey\" />

Example:

<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>

Now create a drawable(edit_text_background) add a resource xml for the background!You can customize as you want!

<?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>

Now as you did set this style in your Activity theme.

Example :

In your Activity you have a theme,set this custom editText theme to that.

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


回答8:

Edittext cursor color you want changes your color.
   <EditText  
    android:layout_width=\"fill_parent\" 
    android:layout_height=\"wrap_content\" 
    android:textCursorDrawable=\"@drawable/color_cursor\"
    />

Then create drawalble xml: color_cursor

<?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>


回答9:

For me I modified both the AppTheme and a value colors.xml

<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>

Here is the colors.xml

<?xml version=\"1.0\" encoding=\"utf-8\"?>
<resources>
    <color name=\"yellow\">#B7EC2A</color>
</resources>

I took out the android:textCursorDrawable attribute to @null that I placed inside the editText style. When I tried using this, the colors would not change.



回答10:

Wow I am real late to this party but it has had activity 17 days ago It would seam we need to consider posting what version of Android we are using for an answer so as of now this answer works with Android 2.1 and above Go to RES/VALUES/STYLES and add the lines of code below and your cursor will be black

    <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>

You will need a this line of code in your RES/COLOR folder

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

Why post this late ? It might be nice to consider some form of categories for the many headed monster Android has become!



回答11:

editcolor.xml

android:textCursorDrawable=\"@drawable/editcolor\"

In xml file set color code of edittext background color



回答12:

The only valid answer should be to change the theme of the activity: <item name=\"colorAccent\">#000000</item> You should not use the android:textCursorDrawable to @null because this only concerns the cursor itself but not the pin below the cursor if you want to drag that cursor. The theming solution is the most serious one.



回答13:

Its even easier than that.

<style name=\"MyTextStyle\">
    <item name=\"android:textCursorDrawable\">#000000</item>
</style>

This works in ICS and beyond. I haven\'t tested it in other versions.



回答14:

use this

android:textCursorDrawable=\"@color/white\"



回答15:

<!-- 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\" />

change t he color of colorAccent in styles.xm, that\'s it simple



回答16:

are you want specific color you must use AppCompatEditText then backround set null

works for me

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

See this gist