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


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.