змінити колір курсора редагування тексту -


74

Як я можу програмно змінити EditText's колір курсору ?

В android 4.0 і вище кольори курсору білі. і якщо EditTextфон s також білий, він стає невидимим.

Відповіді:


121

У ваших властивостях EditText є атрибут android:textCursorDrawable

Тепер встановіть його на @ null, як,

android:textCursorDrawable="@null"

Отже, тепер ваш курсор EditText такий самий, як ваш TextToxt EditText.

Посилання з набору кольорів курсора EditText


5
Мені це потрібно програмно, а не на основі xml
— Адем,

1
@Adem, якщо ви встановите це в XML, ви можете програмувати будь-який колір як колір тексту.
— user363349

3
Це також не спрацьовує для поставленого запитання, тобто як встановити його програмно .
— Адріан

2
OP хоче зробити це за допомогою коду, а не xml-макетів, тож це не правильна відповідь
— Джонатан,

1
@ user370305 завдяки цьому курсор виглядає дуже тонким і майже не видно
— Dipanshu Awasthi

29

Я знайшов спосіб це виправити. Це не найкраще рішення, але воно працює.

На жаль, я можу використовувати лише статичний колір для кольору курсору.

По-перше, я визначаю чорний курсор, який можна малювати

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

Далі я визначаю зразок EditText у макетах.

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

Коли я хочу створити EditText під час виконання, я використовую це:

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

Тепер у вас є подання EditText, яке має чорний курсор. Можливо, хтось може вдосконалити моє рішення, щоб курсор міг бути змінений під час виконання.


Чудова робота, дякую! Працює як шарм для користувацького компонента EditText.
— Дайвери

17

Ось, на мою думку, краще рішення, ніж те, що розмістив @Adem.

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>

9

покращуючи відповідь Джареда Раммлера

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.custom_cursor);
} catch (Exception ignored) {
}

створити custom_cursor.xml у папці res / 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>

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>

7

А як щодо styles.xmlвикористання AppCompat-v7?

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

Працює для мене (цей приклад спрощений).


Чи застосовуються ці акценти для курсорів EditText на пристроях до льодяника для вас?
— Ентоні Шуйнард,

Ні, тоді він бере курсор системи за замовчуванням (на жаль). Хороші відповіді були опубліковані з того часу, набагато повніші.
— shkschneider

2

Ви можете встановити для android:textCursorDrawableатрибута значення, @nullяке призведе до використання android:textColorв якості кольору курсору.

Атрибут textCursorDrawableдоступний в API рівня 12 і вище ...

Дякую...


2

Встановити через AppTheme

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"><!-- Customize your theme here. -->
    <item name="windowNoTitle">true</item>
    <item name="windowActionBar">false</item>
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="android:spinnerStyle">@style/spinner_style</item>
    <!--Add This-->
    <item name="editTextStyle">@style/EdittextStyle</item>
    <item name="android:dropDownListViewStyle">@style/SpinnerStyle</item>
</style>

<!--New EditText Style-->
<style name="EdittextStyle" parent="Widget.AppCompat.EditText">
    <item name="android:background">?attr/editTextBackground</item>
    <item name="android:textColor">?attr/editTextColor</item>
    <item name="android:textAppearance">?android:attr/textAppearanceMediumInverse</item>
    <!--<item name="android:textCursorDrawable">@drawable/abc_text_cursor_material</item>-->
    <item name="colorControlNormal">@color/colorAccent</item>
    <item name="colorControlActivated">@color/colorAccent</item>
    <item name="colorControlHighlight">@color/colorAccent</item>

</style>

1

Отже, ось остаточна версія - не потребує XML і працює як @ null, але програмно:

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

Єдина проблема полягає в тому, що він одного дня може перестати працювати з якоюсь новою версією Android.

PS Я перевірив його на 4.1.2 - 5.1.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.