扩展Widget的样式继承

时间:2014-11-19 20:57:55

标签: android android-custom-view android-theme android-5.0-lollipop

在我的项目(支持AppCompat的Target API 21)中,我需要扩展EditText类。我的问题是MyEditText类没有继承自定义的EditText样式:

<style name="AppTheme" parent="@style/Theme.AppCompat.Light.NoActionBar" >
    <item name="colorPrimary">@color/primary</item>
    <item name="colorControlNormal">@color/grey_light</item>
    <item name="colorControlActivated">@color/primary</item>
    <item name="colorControlHighlight">@color/primary</item>
</style>

@color/primary绿色


截图:

enter image description here

  • 第1行:EditText专注
  • 第2行:EditText未集中(启用)
  • 第3行:MyEditText未集中(启用)

我的问题是:如何在EditText中继承默认的MyEditText样式?

2 个答案:

答案 0 :(得分:6)

有一种非常非常非常容易的方法。

继承此类并查看它是否有效,而不是继承自android.widget.EditText:

android.support.v7.internal.widget.TintEditText

链接到班级:TintEditText.java

阅读该课程的Javadoc,他说:

/**
 * An tint aware {@link android.widget.EditText}.
 * <p>
 * This will automatically be used when you use {@link android.widget.EditText} in your
 * layouts. You should only need to manually use this class when writing custom views.
 */

在此页面的(Using Support Library APIs)中有一个警告,即:在使用支持库中的类时,请确保从相应的包中导入该类。例如,在应用ActionBar类时:

    使用支持库时
  • android.support.v7.app.ActionBar。
  • android.app.ActionBar仅在API级别11或更高级别开发时。

我解释了这一点,也就是说,如果您使用的是支持库,请始终尝试导入或继承相应的包。 (没有比这更好的了解lol。:D)

答案 1 :(得分:3)

您可以使用样式

解决它

在你的主题中

<style name="AppTheme.BaseNoActionBar" parent="Theme.AppCompat.Light">
    <item name="android:editTextStyle">@style/Widget.EditText</item>
</style>


<!-- EditText style -->
<style name="Widget.EditText" parent="Widget.AppCompat.EditText">
    <item name="android:textCursorDrawable">@drawable/cursor_gray</item>
    <item name="android:background">@drawable/underline_gray</item>
</style>

然后定义光标

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
    <size android:width="1dp" />
    <solid android:color="@color/lightGrayLabel"  />
</shape>

和根据这个hack https://stackoverflow.com/a/20891131

的drawable
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:top="-6dp" android:left="-6dp" android:right="-6dp">
        <shape android:shape="rectangle">
            <solid android:color="@android:color/transparent"/>
            <stroke android:color="@color/lightGrayLabel" android:width="3dp"/>
        </shape>
    </item>
</layer-list>

我也尝试使用选择器作为“背景”字段,但它不适用于“android:state_selected”或“android:state_activated”

这是一个小例子

Before

After