Курсор EditText и цвет указателя для Android ниже 5.0

Я пытаюсь изменить цвет указателя курсора EditText (с основного цвета синего на белый), но решение не работает для моего проекта. Я попытался разработать демонстрационный проект, в котором тот же код работает нормально. Этот код отлично работает для ›=android 5.0

Я не знаю, какой атрибут перезаписывается моим значением. У меня есть два варианта решения этой проблемы:

  1. Найдите атрибут, который управляет этим значением цвета.
  2. Измените значение цвета с помощью java-кода при загрузке страницы (в onViewCreated).

Пожалуйста, предложите, как решить эту проблему.

стили.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <style name="my_text_layout_style">
        
        <item name="android:textColor">#FFF</item>
        <item name="android:textColorHint">#FFF</item>
      
        <item name="colorAccent">#FFF</item>
        <item name="colorControlNormal">#FFF</item>
        <item name="colorControlActivated">#FFF</item>

        <item name="colorControlHighlight">#FFF</item>

    </style>

    

    <style name="my_edit_text_style">
        <item name="colorAccent">#FFF</item>
        <item name="android:editTextStyle">@style/MyEditTextStyle</item>
    </style>

    <style name="MyEditTextStyle" parent="Widget.AppCompat.EditText" />
</resources>

макет.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:background="@color/base_disable_btn_bg_color"
    android:orientation="vertical">

    <android.support.design.widget.TextInputLayout
        android:layout_width="match_parent"
        android:hint="just a hint"
        app:hintTextAppearance="@style/my_text_layout_style"
        android:theme="@style/my_text_layout_style"
        android:layout_height="wrap_content">

        <android.support.design.widget.TextInputEditText
            android:layout_width="match_parent"
            android:theme="@style/my_edit_text_style"
            android:layout_height="wrap_content" />

    </android.support.design.widget.TextInputLayout>
</LinearLayout>

Пытался добавить представление программно, но безуспешно

AppLinearLayout appLinearLayout = (AppLinearLayout) view.findViewById(R.id.some_id);
EditText editText = new EditText(new ContextThemeWrapper(getContext(), R.style.AppTheme_Cursor));
ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
editText.setLayoutParams(params);
appLinearLayout.addView(editText);

скриншот


person Harish Gyanani    schedule 20.12.2016    source источник
comment
попробуйте изменить цвет colorAccent в color.xml и дайте мне знать, сработало это или нет   -  person Nainal    schedule 20.12.2016
comment
@JamesMacca пробовал ответ выше, он меняет только цвет курсора, а не цвет указателя.   -  person Harish Gyanani    schedule 20.12.2016
comment
@Nainal проверь мой код, я пробовал.   -  person Harish Gyanani    schedule 20.12.2016
comment
@HarishGyanani А, нет проблем.   -  person James McNee    schedule 20.12.2016
comment
В последней версии студии Android есть две папки для style.xml, вы определили свой стиль в обеих. Один стиль другой стиль-V21   -  person Nainal    schedule 20.12.2016
comment
stackoverflow.com/a/40642542/6747577   -  person Malik Abu Qaoud    schedule 03.01.2017
comment
@MalikAbuQaoud Я использую его в модуле приложения. Я не думаю, что какой-либо другой модуль или файл может переопределить его.   -  person Harish Gyanani    schedule 03.01.2017


Ответы (8)


Попробуйте эту ссылку. Для меня это сработало. И вы можете найти и изменить drawables на своем SDK здесь: Android\sdk\platforms\YOUR_ANDROID_VERSION\data\res at drawables-*dpi.

Вы можете copy and modify их color/form по своему желанию.

person JuLes    schedule 20.12.2016

Попробуйте это решение:

Используйте этот атрибут в EditText: android:textCursorDrawable="@drawable/cursor_color"

В drawable создайте: cursor_color.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >

<size android:width="1dp" />

<solid android:color="#c8c8c8" />

person Rajakumar    schedule 20.12.2016

Используйте это attribute в своем EditText:

android:textCursorDrawable="@null"
person Saurabh Srivastava    schedule 20.12.2016
comment
Пробовал, не работает. Он используется для изменения цвета курсора, а не цвета указателя. - person Harish Gyanani; 20.12.2016

Вы можете создать свой собственный style/theme только для этого EditText и изменить ColorAccent :

<style name="EditTextColorCustom" parent="@style/AppBaseTheme">
    <!-- Customize your theme here. -->
    <item name="colorAccent">@color/colorAccent</item>
</style>

Используйте то же самое в style в вашей папке values-21.

person Saurabh Srivastava    schedule 20.12.2016
comment
values-21 используется в 5.0 или выше, и моя проблема возникает в 4.4 или ниже. Как это решит мою проблему? - person Harish Gyanani; 20.12.2016
comment
Не допускайте неправильного понимания Drawable-21 или values-21 используются для поддержки ниже уровня API 21. - person Saurabh Srivastava; 20.12.2016
comment
Я добавил этот стиль в папки values и values-v21. все еще получаю тот же результат. Тестирование на эмуляторе genymotion 4.4. - person Harish Gyanani; 03.01.2017

Я использовал это, и это работает со мной правильно.

<style name="edittext" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="colorControlNormal">@color/gray</item>
    <item name="colorControlActivated">@color/colorAccent</item>
    <item name="colorControlHighlight">@color/colorAccent</item>
    <item name="android:textColor">@color/white</item>
    <item name="android:textColorHint">@color/gray</item>
</style>

<EditText
            android:id="@+id/email"
            android:layout_width="250dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_marginTop="30dp"
            android:gravity="center"
            android:hint="@string/email_address"
            android:inputType="textEmailAddress"
            android:padding="@dimen/padding_16"
            android:textColor="@color/white"
            android:textColorHint="@color/login_color"
            android:textCursorDrawable="@color/mdtp_white"
            android:theme="@style/edit" />
person Malik Abu Qaoud    schedule 03.01.2017
comment
не работает для меня. Использовался цвет #F00 (красный) в приведенном выше коде везде, где использовался цвет. - person Harish Gyanani; 03.01.2017

Создайте новый drawable.

Вот, cursor.xml:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >
    <size android:width="2dp" />
    <solid android:color="#EF5350"/>
    <stroke android:color="#EF5350"/>
</shape>

и используйте его в EditText следующим образом:

 <EditText
      android:id="@+id/ed"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:background="@drawable/roundedcornerwhite"
      android:hint="edit text"
      android:paddingBottom="10dp"
      android:paddingRight="10dp"
      android:paddingTop="10dp"
      android:maxLines="1"
      android:singleLine="true"
      android:imeOptions="actionNext"
      android:textColor="@color/colorPrimaryText"
      android:textColorHint="@color/hintcolor"
      android:textCursorDrawable="@drawable/cursor"
      android:textSize="16sp" />

ОБНОВЛЕНО:

просто создайте новую тему, например -

<style name="themex" parent="Theme.AppCompat.Light.NoActionBar">

        <item name="colorPrimaryDark">#666666</item>
        <item name="android:listDivider">@color/white_pressed</item>
        <item name="colorPrimary">@color/colorIcons</item>
        <item name="android:textColor">#b6b6b6</item>
        <item name="android:windowDisablePreview">true</item>
        <item name="colorControlActivated">@color/olagreen</item>
        <item name="android:windowAnimationStyle">@null</item>

    </style>

здесь colorcontrolactivated будет ответом на ваш вопрос. И добавьте эту тему в свою деятельность и удалите стиль, который вы указали для редактирования текста в вашем макете.

<activity
            android:name="youractivityname"
            android:parentActivityName="com.example.AboutUs"
            android:screenOrientation="portrait"
            android:theme="@style/themex"/>

ОБНОВИТЬ:

Если это не работает, просто проверьте, находится ли ваш фрагмент внутри действия, и вы указали правильную тему для этого действия. Фрагмент также будет иметь эту тему. Если это не работает, попробуйте это -

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

        android:id="@+id/mainlayout"
        style="@style/themex"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/colorIcons"
        android:orientation="vertical"
        android:weightSum="2">

    </RelativeLayout> 

Я надеюсь, что это поможет вам.

person Aman Verma    schedule 03.01.2017
comment
Меняется только цвет курсора. Цвет указателя такой же, как и раньше (на изображении показан темно-синий # 192B3C). - person Harish Gyanani; 03.01.2017
comment
темно-синий цвет вашего акцента измените его соответственно - person Aman Verma; 03.01.2017
comment
Я хочу изменить цвет акцента edittext. Я не хочу менять цвет акцента для всего приложения. - person Harish Gyanani; 03.01.2017
comment
создайте новую тему или стиль и добавьте этот стиль к конкретному действию в манифесте - person Aman Verma; 03.01.2017
comment
Пожалуйста, проверьте, что я уже сделал это. Дайте мне знать, если вы обнаружите какую-либо проблему в моем коде. - person Harish Gyanani; 03.01.2017
comment
это работает, но я использую фрагменты. Он используется во фрагменте входа в систему. Есть ли какой-либо код для изменения темы для определенного фрагмента? Я видел ответ, который вызывает метод recreate. Должен ли я использовать этот подход? - person Harish Gyanani; 03.01.2017
comment
если ваши фрагменты находятся внутри какого-либо действия, тогда он будет использовать ту же тему для фрагмента, и если это не работает, определите тему для конкретного фрагмента, определив ее в корневом представлении макета. - person Aman Verma; 03.01.2017
comment
проверить ОБНОВЛЕНИЕ 2 - person Aman Verma; 03.01.2017
comment
какое устройство вы пытаетесь, и не могли бы вы обновить еще немного кода... например, вы используете viewpager и pageradapter или что-то для фрагмента внутри активности - person Aman Verma; 03.01.2017
comment
Я тестирую его на 4.4 android genymotion. На 5.1 android genymotion показывает правильно (белый указатель, что я ожидаю). Файл макета я привел выше, он раздут фрагментарно. - person Harish Gyanani; 04.01.2017

Я объединил несколько ответов на SO и нашел лучший способ сделать это:

  1. Найдите исходный рисунок в папке Android SDK (\android-sdk\platforms\android-23\android.jar\res\drawable-hdpi-v4) введите здесь описание изображения

  2. Отредактируйте эти изображения с помощью редактора и поместите их в папку с возможностью рисования.

  3. Добавьте в свой стиль следующие строки:

    <item name="android:textSelectHandle">@drawable/my_drawable_handle</item>
    <item name="android:textSelectHandleLeft">@drawable/my_drawable_handle_left</item>
    <item name="android:textSelectHandleRight">@drawable/my_drawable_handle_right</item>
    

Результат:

введите здесь описание изображения

person Manza    schedule 03.01.2017

<style name="my_edit_text_style">
    <item name="colorAccent">#FFF</item>
    <item name="android:editTextStyle">@style/MyEditTextStyle</item>
    <item name="colorAccent">#FFF</item>
    <item name="colorControlNormal">#FFF</item>
    <item name="colorControlActivated">#FFF</item>
</style>

Это может помочь вам.

person kwaghela    schedule 03.01.2017
comment
У вас есть продублированная строка <item name="colorAccent">#FFF</item>. - person Micer; 16.11.2017