control - edittext android example



Définir textCursorDrawable par programme (2)

la réponse est ---------------------> C'est inaccessible.

En fait, j'ai aussi rencontré ce problème dans mon travail, mais après avoir vérifié le doc et le code source de google, j'adore que vous ne pouvez pas mettre cet attribut dans le code java.

Dans la classe TextView , vous pouvez trouver le code ci-dessous

case com.android.internal.R.styleable.TextView_textCursorDrawable:
    mCursorDrawableRes = a.getResourceId(attr, 0);
    break;

mais la méthode textCursorDrawable() n'existe que dans R.attr , si vous voulez définir cet attribut, vous pouvez seulement appeler la méthode construct ci-dessous en incluant un editText dans le fichier XML.

public EditText(Context context, AttributeSet attrs) {
    this(context, attrs, com.android.internal.R.attr.editTextStyle);
}

https://src-bin.com

Si j'ajoute un EditText en XML, je peux définir textCursorDrawable="@null" :

<EditText
    android:id="@+id/txtE3Casecode4"
    android:layout_width="30dp"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:background="#C7C7C5"
    android:textCursorDrawable="@null"
    android:ems="10"
    android:inputType="number"
    android:maxLength="2"
    android:text="01"
    android:textColor="#000000" />

Maintenant, je dessine un EditText en Java. Je veux mettre android:textCursorDrawable="@null" .

LinearLayout.LayoutParams paramtext = new LinearLayout.LayoutParams(
    LinearLayout.LayoutParams.FILL_PARENT,
    LinearLayout.LayoutParams.WRAP_CONTENT);
EditText txtOther = new EditText(this);
txtOther.setLayoutParams(paramtext);
txtOther.setBackgroundColor(Color.WHITE);
txtOther.setTextColor(Color.BLACK);
txtOther.setId(99999);
// txtOther.setCursorDrawable ?                                

Comment le définir?


Answer #1

Il n'y a pas d'API publique pour définir le curseur. Vous pouvez le définir par programmation en utilisant la réflexion. Le champ mCursorDrawableRes n'a pas été modifié, cela devrait donc fonctionner sur tous les périphériques, sauf si un fabricant a modifié quelque chose ou qu'il est modifié ultérieurement.

Utilisez la réflexion pour définir le curseur:

EditText yourEditText = new EditText(context);

...

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

Définissez un curseur pouvant être tracé dans votre application:

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

Une autre approche:

Vous pouvez également définir la couleur du curseur avec la méthode suivante:

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];
        drawables[0] = editText.getContext().getResources().getDrawable(mCursorDrawableRes);
        drawables[1] = editText.getContext().getResources().getDrawable(mCursorDrawableRes);
        drawables[0].setColorFilter(color, PorterDuff.Mode.SRC_IN);
        drawables[1].setColorFilter(color, PorterDuff.Mode.SRC_IN);
        fCursorDrawable.set(editor, drawables);
    } catch (Throwable ignored) {
    } 
} 




android-edittext