android - studio - cambiar el color del cursor de edittext




programacion android pdf 2018 (6)

¿Cómo puedo cambiar el EditText's cursor de EditText's programáticamente?

En Android 4.0 y superior, el color del cursor es blanco. y si el fondo de EditText también es blanco, se vuelve invisible.


¿Qué pasa con styles.xml con AppCompat-v7?

<item name="colorControlNormal">@color/accentColor</item>
<item name="colorControlActivated">@color/accentColor</item>
<item name="colorControlHighlight">@color/accentColor</item>

Funciona para mí (este ejemplo es simplista).


Aquí está, lo que creo, una solución mejor que lo que @Adem publicó.

Java:

try {
    // https://github.com/android/platform_frameworks_base/blob/kitkat-release/core/java/android/widget/TextView.java#L562-564
    Field f = TextView.class.getDeclaredField("mCursorDrawableRes");
    f.setAccessible(true);
    f.set(yourEditText, R.drawable.cursor);
} catch (Exception ignored) {
}

XML:

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

Encontré una manera de arreglar esto. No es la mejor solución, pero funciona.

Desafortunadamente, solo puedo usar el color estático para el color del cursor.

Primero, defino un cursor negro en 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>

A continuación, defino una muestra EditText en diseños.

<?xml version="1.0" encoding="utf-8"?>
<EditText xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textCursorDrawable="@drawable/blackpipe"
         >
    </EditText>

Cuando quiero crear un EditText en tiempo de ejecución, uso esto:

AttributeSet editText30AttributeSet = null;
int res = getResources().getIdentifier("edit30", "layout", getPackageName());//edit30 is EditText layout
XmlPullParser parser = getResources().getXml(res);
int state=0;
do {
    try {
        state = parser.next();
    } catch (Exception e1) {
        e1.printStackTrace();
    }       
    if (state == XmlPullParser.START_TAG) {
        if (parser.getName().equals("EditText")) {
            editText30AttributeSet = Xml.asAttributeSet(parser);
            break;
        }
    }
} while(state != XmlPullParser.END_DOCUMENT);
EditText view = new EditText(getContext(),editText30AttributeSet);

Ahora tiene una vista EditText que tiene un cursor negro. Tal vez alguien pueda mejorar mi solución para que el cursor pueda cambiarse en tiempo de ejecución.


Entonces, aquí está la versión final: no necesita el XML y funciona como @null pero de forma programática:

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

El único problema es que puede dejar de funcionar algún día con alguna versión nueva de Android.

PD Lo probé en 4.1.2 a 5.1.


Puede establecer el atributo android:textCursorDrawable en @null que dará como resultado el uso de android:textColor como color del cursor.

El atributo textCursorDrawable está disponible en API nivel 12 y superior ...

Gracias...


mejorando la respuesta de Jared Rummler

Java:

try {
    // https://github.com/android/platform_frameworks_base/blob/kitkat-release/core/java/android/widget/TextView.java#L562-564
    Field f = TextView.class.getDeclaredField("mCursorDrawableRes");
    f.setAccessible(true);
    f.set(yourEditText, R.drawable.cursor);
} catch (Exception ignored) {
}

crea custom_cursor.xml en la carpeta res / 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" />

XML:

<EditText xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textCursorDrawable="@drawable/custom_cursor"
     >
</EditText>






user-interface