【发布时间】:2015-02-21 04:21:45
【问题描述】:
我想在我的一些应用样式中设置项目高度。现在海拔只有 21 或更高,没有支持库,所以我的自然倾向是创建一个 styles-v21 xml 并将其放置在其中:
<style name="Widget.MyApp.Drawer" parent="ThemeOverlay.AppCompat.Dark.ActionBar">
<item name="android:elevation">4dp</item>
</style>
问题是我在常规 styles.xml 文件中对 Widget.MyApp.Drawer 所做的任何更改都将被它完全覆盖。我想要的是将高程添加到我为 style.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 中将样式留空,在styles-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 等样式也继承自它。如您所见,这有点荒谬。
我是不是想多了?在我看来,这里有 3 个选择:
1) 按原样继续,感觉自己像个白痴
2) 在 BaseListElement 级别上,创建一个带有一些愚蠢名称的子样式,这是我应用高程的点,然后(希望)会向下渗透到所有子代。但是,一旦我在基础的 v21 子代之间存在差异,这将不起作用。
3) 只需将android:elevation 放入styles.xml 文件(不要使用v21 文件)并在元素上放置一个忽略标志。我这里只有 5.0 设备,所以我目前无法轻松测试这是否会导致旧版本崩溃。
有什么想法吗?
【问题讨论】:
-
你能在模拟器上测试 3 吗? Genymotion 非常容易设置。