EditText с настраиваемой темой показывает подчеркивание под маркой выделения

Я пытаюсь изменить цвет подчеркивания EditText, применив тему.

Стиль:

<style name="MyTheme.EditText" parent="Widget.AppCompat.EditText">
    <item name="colorControlActivated">@color/green</item>
</style>

EditText:

<EditText
    android:id="@+id/editText_amount"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="@string/hint_enter_amount"
    android:theme="@style/MyTheme.EditText"/>

В основном это работает, но когда я пытаюсь выбрать или переместить курсор, выделение также подчеркнуто. Вы можете видеть это на скриншоте.

Снимок экрана

Кто-нибудь знает, как это исправить?

Ответ 1

Вы можете использовать этот стиль как

<EditText 
   style="@style/MyTheme.EditText"/>

Или вы можете отделить свою тему для ссылки на атрибут editTextStyle.

<style name="MyEditTextStyle" parent="Widget.AppCompat.EditText">
    <item name="colorControlActivated">@color/green</item>
</style>

<style name="MyTheme.EditText">
    <item name="editTextStyle">@style/MyEditTextStyle</item>
</style>

<EditText
    android:theme="@style/MyTheme.EditText"/>

Хорошо, но откуда взялись эти подчеркивания?

android:theme является атрибутом представления и когда вы устанавливаете стиль как android:theme, этот стиль будет обернут ContextThemeWrapper с контекстной темой при инфляции представления.

Таким образом, если вы установите свойство android:theme со стилем, содержащим элемент android:background, например

<item name="android:background">@color/green</item>

каждый дочерний вид этого владельца темы будет иметь зеленый фон.

"Widget.AppCompat.EditText" - это стиль и ссылки ?attr/editTextBackground как "android:background". И в файле v21/values-21.xml @drawable/abc_edit_text_material определяется как editTextBackground.

Итак, для вашего примера @drawable/abc_edit_text_material становится фоном вашего EditText и SelectionHandlers.

Ответ 2

Вы должны удалить родительский атрибут. Это вызвано только устройством API 23.

<style name="MyTheme.EditText">
    <item name="colorControlActivated">@color/green</item>
</style>

Ответ 3

У меня была такая же проблема.

Мой макет показывает Edittext внутри синего квадрата. Там я хотел иметь белый текст и белую подсветку и белый элемент управления. Я установил все в своем AppTheme. Все отлично!

Но у меня также был удар Recyclerview в синюю коробку. RecyclerView имеет белые карты, содержащие Edittext. Белый текст, подчеркивание и контроль не имеют никакого смысла в белых карточках.:)

Итак, я попытался изменить цвет текста, подчеркнуть и контролировать до темно-серого. Но безуспешно. У меня были те же проблемы с контролем, что и в этом вопросе.

Я попытался использовать решенный ответ, но это мне не помогло. Может быть, моя вина, не знаю.

Итак, я отправляю здесь свое решение, даже на вопрос уже ответил.

Внутри styles.xml я добавил:

<style name="RecyclerEditText">
    <item name="colorAccent">@color/darkGray</item>
    <item name="colorControlNormal">@color/darkGray</item>
    <item name="colorControlActivated">@color/darkGray</item>
</style>

и в макете xml я добавил внутри edittext:

android:textColor="@color/darkGray"
android:textColorHint="@color/darkGray"
android:theme="@style/RecyclerEditText"

-

Теперь у меня нет смещения в значке управления и нет двойной подчеркивания.

Спасибо большое @litmon! Вы подтолкнули меня к идее "удалить родителя".