我想在我的某些应用程序样式中设置项目提升。现在海拔只有21和更高,没有支持库,所以我的自然倾向是创建一个样式-v21 xml并将其放在那里:
<style name="Widget.MyApp.Drawer" parent="ThemeOverlay.AppCompat.Dark.ActionBar">
<item name="android:elevation">4dp</item>
</style>
这个问题是我对常规styles.xml文件中的Widget.MyApp.Drawer所做的任何更改都将被完全覆盖。我想要的是将高程添加到我为styles.xml中列出的此样式的v21版本所做的样式更改列表的底部。
所以我开始创建基本样式,我在视图中使用的样式继承自:
<style name="BaseListElement">
<item name="android:background">@drawable/listitem_background</item>
<item name="android:layout_height">@dimen/list_item_height</item>
</style>
<style name="BaseListElement.ListItem">
</style>
我将样式留在styles.xml中,而在样式-v21中,我添加了高程并且它可以正常工作。
然而,当我想使用一些高级样式时,这会变得棘手:
<style name="BaseListElement">
<item name="android:background">@drawable/listitem_background</item>
<item name="android:layout_height">@dimen/list_item_height</item>
</style>
<style name="BaseListElement.BaseItem">
<item name="android:padding">@dimen/list_item_padding</item>
</style>
<style name="Widget.MyApp.ListItem" parent="@style/BaseListElement.BaseItem">
</style>
<style name="BaseListElement.BaseHeader">
</style>
在这种情况下,BaseItem只是一种从BaseListElement继承的样式,BaseHeader等样式也从它继承。你可以看到,这有点荒谬。
我是否过度思考这个?我看到它的方式我有三个选择:
1)继续原样,感觉自己像个白痴
2)在BaseListElement级别上,创建一个具有某种愚蠢名称的子样式,这是我应用高程的点,然后(希望)将其传递给所有孩子。然而,只要我对基地的v21孩子有所区别,这就行不通。
3)只需将android:elevation
抛出到styles.xml文件中(不要使用v21文件)并在元素上放置一个ignore标志。我这里只有5.0个设备,所以如果这会导致旧版本崩溃,我现在无法轻松测试。
有什么想法吗?
答案 0 :(得分:5)
要完成这样的操作,您只需在BaseListElement.BaseItem
和styles.xml
中创建一个syles-v21.xml
,第一个没有高程,第二个没有高程。然后,只需从Widget.MyApp.ListItem
扩展BaseListElement.BaseItem
,该版本应在v21中更新,以使用elevation
。
styles.xml
<style name="BaseListElement.BaseItem">
</style>
<style name="Widget.MyApp.ListItem" parent="@style/BaseListElement.BaseItem">
</style>
样式-v21.xml
<style name="BaseListElement.BaseItem">
<item name="android:padding">@dimen/list_item_padding</item>
</style>
方法3您可以安全地实施如下:
<item name="android:elevation" tools:ignore="NewApi">4dp</item>