使用AppCompat.EditText设置AutoCompleteTextView样式不起作用

时间:2014-12-26 16:14:05

标签: android android-layout android-appcompat material-design

我制作材料设计风格应用

我想更改AutoCompleteTextView样式
android.support.v7.internal.widget.TintEditText

中的样式

我在style.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似乎使用colorControlActivatedcolorControlNormal。因此,我试图在先前的样式定义中覆盖这些属性,但它没有效果 我需要做什么才能让它发挥作用?

3 个答案:

答案 0 :(得分:5)

尝试以这种方式在xml中添加用于窗口小部件的所需样式:

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

如果这不起作用,您可以尝试自己设计样式。 您必须更改可以查找的here

的TextView属性

可以通过更改应添加到样式中的android:textColor属性来更改实例的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>

在drawables文件夹中添加一个新文件line_background.xml,内容类似:

<?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>

答案 1 :(得分:3)

我已经创建了自定义Tint 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

将来可能会改变或变得不可用。 请看下面的Derek的答案 - 它解决了我的答案背景引起的问题。

答案 2 :(得分:2)

根据@ Atrinax的答案推断,这是一个将通过扩展AutoCompleteTextView并将其添加到TINT_ATTRS来处理popupBackground属性的类

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();
}
}