覆盖引用的样式属性

时间:2013-06-14 08:06:42

标签: android styles themes override checkedtextview

阅读References To Theme Attributes后,我试图引用我设置的自定义主题中的属性值。

我正在将用户定义的样式应用于CheckedTextView

<CheckedTextView
    android:id="@+id/contactInfo"
    style="@style/ListViewCheckedTextViewRowStyle" >
</CheckedTextView>

用户定义的样式定义为:

<style name="ListViewCheckedTextViewRowStyle" parent="@style/ListViewRowStyle">
    <item name="android:checkMark">?android:listChoiceIndicatorMultiple</item>
</style>

我创建的主题定义为:

<style name="Theme.Yellowgreen" parent="android:Theme.Holo.Light.DarkActionBar">
    <item name="android:listChoiceIndicatorMultiple">@drawable/btn_check_holo_light</item>
</style>

但是,显示的checkMark样式是设备的默认主题的drawable,而不是我的用户定义的drawable。

我可以显示可绘制的唯一方法是:

<style name="ListViewCheckedTextViewRowStyle" parent="@style/ListViewRowStyle">
    <item name="android:checkMark">@drawable/btn_check_holo_light</item>
</style>

但是这会破坏覆盖此属性的整个目的,特别是因为我想在多个主题中覆盖此属性。

我正在onCreate()的{​​{1}}方法中设置主题,如下所示:

Activity

我还尝试在AndroidManifest.xml文件中设置主题,如:

public void onCreate(Bundle savedInstanceState) {
    this.setTheme(R.style.Theme_Yellowgreen);
    super.onCreate(savedInstanceState);
    // ...
}

但那没用。可能出现什么问题?

更新

我刚刚创建了一个小型示例项目,看起来我上面发布的代码正在运行。所以我必须有一些其他样式覆盖这个属性,或者它可能与我的布局xml文件有关。

在我的大型项目中,我在<application android:theme="@style/Theme.Yellowgreen" > 内有两个FragmentsActivity Fragments都有Listviews支持Adapters。在Fragment A中,getView()的{​​{1}}方法如下:

Adapter

public View getView(final int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = mInflater.inflate(R.layout.contact_entry, null); } //... return convertView; } 中,Fragment B的{​​{1}}方法如下:

getView()

布局定义如下:

list_item.xml

Adapter

list_item_header.xml

public View getView(final int position, View convertView, ViewGroup parent) {
    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.list_item, parent, false);
    }

    //...

    return convertView;
}

contact_entry.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout  xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/list_item"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <include layout="@layout/list_item_header" />

    <include layout="@layout/contact_entry" />

    <View android:id="@+id/list_divider"
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="@android:drawable/divider_horizontal_dark" />

</LinearLayout>

出于某种原因,在<?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/header_text" android:layout_width="match_parent" android:layout_height="25dip" android:background="@color/dark_blue" android:gravity="center_vertical" android:paddingLeft="6dip" android:textColor="@color/white" android:textSize="14sp" android:textStyle="bold" /> 中,主题checkMark属性无法正确呈现,而在<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/contactEntry" android:layout_width="match_parent" android:layout_height="wrap_content" android:minHeight="?android:attr/listPreferredItemHeight" android:orientation="horizontal" > <QuickContactBadge android:id="@+id/contactPic" style="@style/ContactPicStyle" /> <CheckedTextView android:id="@+id/contactInfo" style="@style/ListViewCheckedTextViewRowStyle" > </CheckedTextView> </LinearLayout> 中,checkMark使用当前的YellowGreen主题并且样式正确。为什么会发生这种情况?

1 个答案:

答案 0 :(得分:11)

我认为你的主题需要这一行

<item name="android:checkedTextViewStyle">@style/ListViewCheckedTextViewRowStyle</item>

所以它看起来像这样:

<style name="Theme.Yellowgreen" parent="android:Theme.Holo.Light.DarkActionBar">
    <item name="android:listChoiceIndicatorMultiple">@drawable/btn_check_holo_light</item>
    <item name="android:checkedTextViewStyle">@style/ListViewCheckedTextViewRowStyle</item>
</style>

<强>更新

在问题更新和一些其他信息表单评论后,我们发现问题出在Context。这与我在我的问题中所犯的错误相同:Android color selector doesn't work with custom attributes

将一个片段传递给Activity并传递给另一个Application。我不是专家,但即使这两个类都只扩展Context Activity扩展ContextThemeWrapper,其中包含有关样式的信息。阅读该文章以便将来理解上下文可能会有所帮助:http://www.doubleencore.com/2013/06/context/