Подтвердить что ты не робот

Программный код textCursorDrawable

Если я добавлю EditText в XML, я могу установить 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" />

Теперь я рисую EditText в Java. Я хочу установить 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 ?                                

Как установить его?

4b9b3361

Ответ 1

Нет общедоступного API для установки курсора. Вы можете установить его программно, используя отражение. Поле mCursorDrawableRes не изменилось, поэтому это должно работать на всех устройствах, если производитель не изменил что-то или не будет изменен.

Используйте отражение для установки курсора:

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

Определите курсор, который можно использовать в вашем приложении:

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

Другой подход:

Вы также можете установить цвет курсора следующим образом:

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

Ответ 2

Ответ --------------------- > Это недостижимый.

Собственно, я также встречал эту проблему в своей работе, но после проверки документа google и исходного кода я хотел бы, чтобы этот атрибут не был указан в java-коде.

В классе TextView вы можете найти код ниже

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

но метод textCursorDrawable() существует только в R.attr, если вы хотите установить этот атрибут, вы можете вызвать метод construct ниже, включив в файл XML файл editText.

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

Ответ 3

Если вы используете библиотеку AppCompat, и ваша активность расширяет AppCompatActivity, вы можете установить цвет текстового курсора (для всех EditTexts), используя стиль XML colorAccent:

<style name="AppTheme" parent="@style/Theme.AppCompat">
    <item name="colorAccent">#FF4081</item>
</style>

Это работает на Android 5+ и обратно совместимо со старыми версиями Android от Android 4.4 (API 19) до Android 4.0 (API 14). Примечание. Если вы используете AutoCompleteTextView, убедитесь, что любой пользовательский подкласс расширяет AppCompatAutoCompleteTextView, в противном случае стиль текстового курсора не будет работать.

См. также это руководство, как применить цветовой акцент (оттенок) к кнопкам Dialog: Android v21 Theme.Appcompat цветной акцент игнорируется, без отступов в диалогах