阅读完主题属性引用后,我想引用我设置的自定义主题中属性的值。
我正在将用户定义的样式应用于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。
唯一一种我能让我的drawable显示出来的方式是:
<style name="ListViewCheckedTextViewRowStyle" parent="@style/ListViewRowStyle">
<item name="android:checkMark">@drawable/btn_check_holo_light</item>
</style>
但这样做会完全打败覆盖此属性的整个目的,特别是因为我想在多个主题中覆盖此属性。
我正在使用以下代码在我的Activity
的onCreate()
方法中设置主题:
public void onCreate(Bundle savedInstanceState) {
this.setTheme(R.style.Theme_Yellowgreen);
super.onCreate(savedInstanceState);
// ...
}
我也尝试在AndroidManifest.xml文件中设置主题,例如:
<application android:theme="@style/Theme.Yellowgreen" >
但是那样没有起作用。可能出了什么问题?
更新
我刚刚创建了一个小的示例项目,看起来我上面发布的代码是可以工作的。所以我肯定有其他的样式覆盖了这个属性,或者可能与我的布局xml文件有关。
在我的大型项目中,我有两个Fragment
位于一个Activity
中。两个Fragment
都有由Adapters
支持的Listviews
。在Fragment A
中,Adapter
的getView()
方法如下:
public View getView(final int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = mInflater.inflate(R.layout.contact_entry, null);
}
//...
return convertView;
}
在片段B
中,Adapter
的getView()
方法如下:
public View getView(final int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = mInflater.inflate(R.layout.list_item, parent, false);
}
//...
return convertView;
}
布局定义如下:
list_item.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>
list_item_header.xml
<?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" />
contact_entry.xml
<?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>
由于某种原因,在片段B
中,主题化的checkMark属性无法正确地呈现,而在片段A
中,checkMark使用当前的YellowGreen主题,并且被正确地样式化。为什么会发生这种情况?
YellowGreen
,为什么在清单文件中要写成@style/Theme.Yellowgreen
呢?我对自定义主题并不是很了解,只是想搞清楚。 - Gokhan ArikonCreate
之后调用setTheme
。否则我不知道,在看到你的所有代码之前我无法发表任何评论。 - Gokhan ArikListViewRowStyle
?这是在一个API级别上发生的还是一般行为? - user