Программный код 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 ?
Как установить его?
Ответы
Ответ 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 цветной акцент игнорируется, без отступов в диалогах
Ответ 4
Использование отражения для отрисовки курсора запрещено Android Q.
Вместо этого есть новый setTextCursorDrawable API , и мы можем использовать это.