Стиль 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"/>
это работает, но цвета линий не меняются.
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();
}
}