Стиль AutoCompleteTextView с AppCompat.Полей EditText не работает

я делаю применение стиля дизайна материала

Я хочу изменить AutoCompleteTextView стиль
стиль как в android.support.v7.internal.widget.TintEditText

я добавил стиль к моему стилю.XML-код:

<style name="AppTheme" parent="AppTheme.Base"/>
<style name="AppTheme.Base" parent="Theme.AppCompat">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="android:autoCompleteTextViewStyle">@style/AutoCompleteTextViewAppTheme</item>
</style>
<style name="AutoCompleteTextViewAppTheme" parent="Base.Widget.AppCompat.EditText"/>

это работает, но цвета линий не меняются. enter image description here

EditTexts с материальным дизайном, похоже, используют colorControlActivated и colorControlNormal. Поэтому я попытался переопределить эти свойства в предыдущем определении стиля, но это не имеет никакого эффекта.
Что мне нужно сделать? это работает ?

3 ответов


попробуйте добавить нужный стиль для использования виджета в xml следующим образом:

<View
style="@style/NameOfYourTheme"
...
/>

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

Textcolor для экземпляра может быть изменен путем изменения android:textColor атрибут, который должен быть добавлен в ваш стиль, например:

<style name="AutoCompleteTextViewAppTheme" parent="Base.Widget.AppCompat.EditText"/>

<item name="android:textColor">#ffffffff</item>
</style>

если вы хотите изменить строку edittext, вы должны изменить атрибут фона, например таким образом:

<item name ="android:background="@drawable/line_background"> </item>

и добавить новый файл line_background.xml в папке drawables с аналогичным контентом:

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


    <stroke
        android:color="#c0c000"
        android:width="3dp"></stroke>
</shape>

Я создал пользовательский оттенок Aware AutoCompleteTextView для решения этой проблемы.

package com.atrinax.gist;

import android.content.Context;
import android.support.v7.internal.widget.TintTypedArray;
import android.util.AttributeSet;
import android.widget.AutoCompleteTextView;

public class TintAutoComplete extends AutoCompleteTextView {

private static final int[] TINT_ATTRS = {
        android.R.attr.background
};

public TintAutoComplete(Context context) {
    this(context, null);
}

public TintAutoComplete(Context context, AttributeSet attrs) {
    this(context, attrs, android.R.attr.editTextStyle);
}

public TintAutoComplete(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);

    TintTypedArray a = TintTypedArray.obtainStyledAttributes(context, attrs, TINT_ATTRS,
            defStyleAttr, 0);
    setBackgroundDrawable(a.getDrawable(0));
    a.recycle();
}
}

добавьте этот класс в свой проект. Используйте в xml следующим образом:

<com.atrinax.gist.TintAutoComplete
android:layout_width="fill_parent"
android:layout_height="fill_parent" />

недостатком этого решения является то, что оно опирается на внутренний класс

android.support.v7.internal.widget.TintTypedArray

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


чтобы экстраполировать ответ @Atrinax, вот класс, который будет обрабатывать popupBackground атрибут путем расширения AutoCompleteTextView и добавления его в TINT_ATTRS

public class TintAutoCompleteTextView extends AutoCompleteTextView {

private static final int[] TINT_ATTRS = {
        android.R.attr.background,
        android.R.attr.popupBackground
};

public TintAutoCompleteTextView(Context context) {
    this(context, null);
}

public TintAutoCompleteTextView(Context context, AttributeSet attrs) {
    this(context, attrs, android.R.attr.autoCompleteTextViewStyle);
}

public TintAutoCompleteTextView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);

    TintTypedArray a = TintTypedArray.obtainStyledAttributes(context, attrs, TINT_ATTRS,
            defStyleAttr, 0);
    setBackgroundDrawable(a.getDrawable(0));
    setDropDownBackgroundDrawable(a.getDrawable(1));
    a.recycle();
}
}