Establecer el color del cursor EditText

526

Tengo este problema cuando uso el tema Holo de Android en un proyecto de tableta. Sin embargo, tengo un fragmento en la pantalla que tiene un fondo blanco. Estoy agregando un EditTextcomponente en este fragmento. Intenté anular el tema estableciendo el fondo de los recursos del tema Holo.Light. Sin embargo, mi cursor de texto (quilate) permanece blanco y, por lo tanto, invisible en la pantalla (puedo verlo débilmente en el campo de edición de texto ...).

¿Alguien sabe cómo puedo hacer que EditText use un color de cursor más oscuro? Intenté configurar el estilo de EditText "@android:style/Widget.Holo.Light.EditText"sin ningún resultado positivo.

cena
fuente

Respuestas:

1170

Establecer el android:textCursorDrawableatributo en @nulldebería resultar en el uso de android:textColorcomo el color del cursor.

El atributo "textCursorDrawable" está disponible en el nivel de API 12 y superior

Decano
fuente
24
¡oh hombre que es MUCHO más eficiente que conjurar un dibujo para que el cursor sea negro! Amo a Android hasta la muerte, pero este es un comportamiento predeterminado increíblemente malo ... alguien realmente necesita ser golpeado por eso.
Yevgeny Simkin
26
Android 3.2 y superior .. apesta
Blundell
77
Aunque si target> 3.2 en su manifiesto puede usarlo y será ignorado para versiones inferiores
Blundell
55
Parece utilizar el color de la pista en su lugar si lo configura. Al menos en 4.2. La opción de cursor no tiene problemas para mí desde 2.3.3-4.4
MinceMan
55
Esto no funciona en versiones más recientes de Android. En su lugar, muestra un cursor gris y se mete con la funcionalidad de resaltado. Utilice la respuesta de @ star18bit en su lugar.
Matthew Bahr
481

En diseño

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

Luego cree xml drawalble: 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>

Tiene un cursor de color blanco en la propiedad EditText.

star18bit
fuente
3
El atributo "textCursorDrawable" solo se usa en el nivel de API 12 y superior
mr.boyfox
64
Esta es la respuesta correcta. No estoy seguro de por qué tanta gente piensa que poner el cursor en "@null" parece una buena idea
Greg Ennis
1
arriba de la respuesta, configure textCursorDrawable ya que los resultados @null se ven bien, pero la orientación del cursor no tiene sentido, sin embargo, esta respuesta funciona realmente bien. Realmente gracias
iroiroys
¿Podemos usar el mismo Excel con diferentes colores para el cursor?
VVB
1
Esta es la mejor solución.
Antônio Sérgio Ferraz
71

Parece que todas las respuestas van alrededor de los arbustos.

En su EditText, use la propiedad:

android:textCursorDrawable="@drawable/black_cursor"

y agregue el sorteo black_cursor.xmla sus recursos, de la siguiente manera:

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

Esta es también la forma de crear cursores más diversos, si es necesario.

Zach-M
fuente
3
Esto no funciona en Android 4.2 Jelly Bean ... El cursor desaparece, @null es el camino a seguir.
Edgar
@Edgar Esto parece funcionar para mí en 4.2 JB muy bien en el nivel de temas.
mkuech
Android 4.2.2 funciona bien. No olvides agregar <android sólido: color = "# 000000" /> en black_cursor.xml
Andrei Aulaska
El atributo "textCursorDrawable" solo se usa en el nivel de API 12 y superior
mr.boyfox
53

Hay una nueva forma de cambiar el color del cursor en la última Appcompactv21.
Simplemente cambie el colorAccentestilo de esta manera:

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

Luego aplique este estilo en el tema o las actividades de su aplicación.

Actualización : de esta manera solo funciona en API 21+
Actualización 2 : no estoy seguro de la versión mínima de Android que puede funcionar.
Probado por la versión de Android:

2.3.7 - didn't work
4.4.4 - worked
5.0 - worked
5.1 - worked
R4j
fuente
1
Me temo que la respuesta es no. Probé en un dispositivo API 18 y no funciona.
R4j
1
Trabajando en mi Sony Experia. PreLollipop (4.4.4). También usando la biblioteca AppCompat. :)
vida
No funciona para API 24 / Android 7.0. colorAccentcambia, por ejemplo, la línea en la parte inferior de un EditTextpero no toca el color real del cursor. Ah, y ya no hay "v21", por supuesto.
Neph
39

Encontré la respuesta :)

He configurado el estilo editText del tema en:

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

Luego he usado el siguiente dibujo para establecer el 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 es la clave aquí.

cena
fuente
3
stackoverflow.com/questions/2658772/android-vertical-line-xml podría ser útil para cualquiera que quiera hacer un cursor dibujable que sea solo una línea vertical :)
Andrew Wyld
1
¿pueden decirnos cómo podemos establecer el color del cursor mediante programación?
Anil MH
Tuve un problema cuando nombré el elemento android:editTextStyle, pero lo cambié para editTextStylesolucionarlo. Ver stackoverflow.com/a/34010235/6744473
zapato
24

Para cualquiera que necesite establecer el EditTextcolor del cursor dinámicamente, a continuación encontrará dos formas de lograrlo.


Primero, crea tu cursor dibujable:

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

Establezca la identificación del recurso dibujable del cursor en el dibujable que creó (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) {
}

Para cambiar simplemente el color del cursor predeterminado dibujable, puede usar el siguiente método:

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) {
    }
}
Jared Rummler
fuente
Realmente me molesta que esto funcione. AppCompatEditTextya lo ha hecho setSupportBackgroundTintList, entonces, ¿no sería bastante simple agregar algo como setSupportCursorTintList?
Joseph Piché
66
@Jared Rummler su solución funcionó para el cursor, pero la gota que aparece debajo del cursor (cuando selecciona el texto, parece que dos de ellos) todavía son del color original. ¿Me puede ayudar con esto?
Felipe Ribeiro R. Magalhaes
2
Su 3. enfoque no funcionó en Android 9 pero está bien para las versiones siguientes.
Muhammed Yalçın Kuru el
11

Tarde a la fiesta, esta es mi respuesta,

¡Esto es para las personas que no buscan cambiar el colorAccenttema principal, pero quieren cambiar los EditTextatributos!

Esta respuesta muestra cómo cambiar ......

  1. Color de la línea de fondo
  2. Color del cursor
  3. Color del puntero del cursor (utilicé mi imagen personalizada) .......... de EditTextusar el estilo aplicado al tema Actividad.

ingrese la descripción de la imagen aquí

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

Ejemplo:

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

¡Ahora crea un drawable ( edit_text_background), agrega un recurso xml para el fondo! ¡Puedes personalizarlo como quieras!

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

Ahora, como configuraste este estilo en tu tema Actividad.

Ejemplo:

En su Actividad, tiene un tema, establezca este editTexttema personalizado en eso.

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Your Theme data -->
    <item name="editTextStyle">@style/AppTheme.EditText</item> // inculude this
</style>
Charu ක
fuente
<item name="editTextStyle">@style/AppTheme.EditText</item> // inculude thissin efecto
act262
¿Es AppCompatEditText?
Charu ක
1
oh, estoy equivocado Escribí el atributo incorrecto android:editTextSteyle, el atributo correcto eseditTextStyle
act262
<item name="android:textCursorDrawable">@color/white</item>no funciona
Vlad
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"
    />

Luego crea xml extraíble: 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>
afluencia
fuente
7

Para mí modifiqué tanto el AppTheme como un valor 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>

Aquí está el colors.xml

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

Saqué el atributo android: textCursorDrawable a @null que coloqué dentro del estilo editText. Cuando intenté usar esto, los colores no cambiaron.

Emily Alexandra Conroyd
fuente
Sí, eso funciona, pero también cambia otros elementos del tema cuando todo lo que necesita es cambiar el color del cursor.
AlanKley
7

Wow, llegué muy tarde a esta fiesta, pero ha tenido actividad hace 17 días Parece que debemos considerar publicar qué versión de Android estamos usando para una respuesta, por lo que esta respuesta funciona con Android 2.1 y superior Ir a RES / VALORES / ESTILOS y agregue las líneas de código a continuación y su cursor será negro

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

Necesitará esta línea de código en su carpeta RES / COLOR

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

¿Por qué publicar tan tarde? ¡Sería bueno considerar alguna forma de categorías para el monstruo con muchas cabezas en el que se ha convertido Android!

Vector
fuente
El atributo requiere un nivel de API 21 no 7 (2.1)
zapato
4

Aquí la versión programática setCursorDrawableColor () de @Jared Rummler adaptada para funcionar también en Android 9 Pie.

@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);
    }
}
Oliver Jonas
fuente
1
java.lang.NoSuchFieldException: No field mDrawableForCursor en Android 9.
zakjma
4

eso se llama colorAccenten Android.

vaya a res -> valores -> styles.xml add

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

si no existe

Niamatullah Bakhshi
fuente
3

editcolor.xml

android:textCursorDrawable="@drawable/editcolor"

En el archivo xml establece el código de edittextcolor del color de fondo

Avitor Titoriya
fuente
Simplemente elimine el corsor que parpadea en edittext
Avnish Titoriya
2

La única respuesta válida debe ser cambiar el tema de la actividad: <item name="colorAccent">#000000</item> No use el android:textCursorDrawableque @nulldebido a esto sólo se refiere el cursor en sí, pero no el pasador debajo del cursor si quieres que arrastrar el cursor. La solución temática es la más seria.

JPhi Denis
fuente
2

Otra solución simple sería ir a res> values> colors.xml en la carpeta del proyecto y editar el valor del acento de color al color que prefiera

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

El código anterior cambia el cursor a negro.

xwaxes
fuente
Gracias, eso es exactamente lo que estaba buscando
Shivam Jha
2
<resources>

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimary</item>
    <item name="colorAccent">@color/colorAccent</item> -- change this one
</style>

Vaya a styles.xml y cambie el acento de color y esto influirá en el cursor desde el cuadro de edición de texto.

dave o grady
fuente
1

Es incluso más fácil que eso.

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

Esto funciona en ICS y más allá. No lo he probado en otras versiones.

Clark luchará
fuente
3
tenga cuidado, si va a aplicar este estilo a su EditText (este no tiene un estilo principal, que debería ser el predeterminado para su tema), perderá todos los demás estilos que provienen del Holo Theme.
Varun
¿No es lo mismo que el valor "@null"?
Paul Verest
puede agregar un estilo justo a una vista, que anula el tema de la actividad.
JPhi Denis
1

si desea un color específico, debe usar AppCompatEditText y luego establecer el fondo nulo

funciona para mi

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

Mira esta esencia

denizs
fuente
1

Utilizar este

android:textCursorDrawable="@color/white"
Mohammed Alzoubi
fuente
2
El cursor desaparece en mi dispositivo, así que use un color dibujable en lugar de directo.
Fruta
1

Presta atención a tu colorAccent en tu Actividad / fragmento / Diálogo actual, definido en Estilos ...;) el color del cursor está relacionado con él.

Arnaud
fuente
0

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

cambiar el color de colorAcentuar en styles.xm, eso es simple

Abhishek Saini
fuente
0

Si usa estilo e implemento

colorControlActivate

reemplace su valor que no sea color / blanco.

latifalbr
fuente
0

puedes usar el siguiente código en el diseño

android:textCursorDrawable="@color/red"
        android:textColor="@color/black
Tienanhvn
fuente
0

Después de pasar mucho tiempo probando todas estas técnicas en un Diálogo, finalmente tuve esta idea: adjuntar el tema al Diálogo en sí y no al TextInputLayout.

<style name="AppTheme_Dialog" parent="Theme.AppCompat.Dialog">

    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorWhite</item>
    <item name="colorAccent">@color/colorPrimary</item>

</style>

dentro de Crear:

myDialog de clase pública extiende el diálogo {

private Activity activity;
private someVars;

public PopupFeedBack(Activity activity){
    super(activity, R.style.AppTheme_Dialog);
    setContentView(R.layout.myView);
    ....}}

salud :)

Arnaud
fuente