设置Android背景和持久性菜单栏-在旧版本上使用属性会导致崩溃-是否有主题/图案方法?


74

在Android 3.0中,可以使用“激活的”背景来呈现“选中”的概念。这为您提供了在单击列表片段时看到的持久条,为列表的右侧提供了片段的上下文(例如,在Gmail中单击某个文件夹将突出显示该文件夹,并打开另一个列表片段以显示该文件夹中的对话)。

例如,片段样本显示如下内容:

setListAdapter(new ArrayAdapter<String>(getActivity(),
                    android.R.layout.simple_list_item_activated_1, Shakespeare.TITLES));

该资源(android.R.layout.simple_list_item_activated_1)是Android 3.0的新功能。使它“激活”的原因是:

android:background="?android:attr/activatedBackgroundIndicator"

据我所知,该属性值是Android 3.0的新增功能,如果您尝试在早期版本的Android上使用它,将会导致崩溃。我想将背景设置为3.0 /大/横向组合的此神奇值,否则将其跳过。

我可以通过使用两个单独的布局版本来实现此目的,一个版本在-v11资源集中,一个在常规资源集中。不过,这比我想要的DRY少了一点,因为布局的大部分是相同的,只有一个属性被包含或被跳过。

我尝试使用可绘制资源别名时遇到了麻烦,因此android:background可以引用别名,并且别名可以处理-v11差异,但是<bitmap>可绘制对象似乎并不喜欢android:src="@null"

我怀疑有解决此问题的样式和主题的方法,但是由于我从未完全解决这些问题(这是我最尴尬的Android知识鸿沟之一),因此我不确定要怎么做。

有没有人想出一种模式,可以在3.0上使用“激活”,而在3.0之前的版本中可以跳过单独的布局呢?

谢谢!


<include />不能在这里工作?还是主题的不同版本?
亚历山大

@alexanderblom:<include>在这里无济于事-我需要行布局的根元素上的背景。当然,“主题的不同版本”确实存在可能性,但这就是为什么我要问这个问题。:-)
CommonsWare

是的,乍一看,主题分开了-v11或似乎不是走的路。较少的复制/粘贴操作至少可以完成整个布局:/
Nathan Schwermann

另外,怎么样@android:color/transparent
Roman Nurik

@Roman Nurik:我假设你的意思不是@null?那可能行得通。顺带一提,就Android愿景的保真度而言,我认为Al概述的样式方法会更“合适”-您同意吗?归根结底,这个问题毕竟不是我的问题,而是我告诉读者的问题,所以我想走Google希望Android开发人员使用的路线。
CommonsWare

Answers:


57

样式是您的朋友。

有两个值目录,一个是values-v11,另一个是默认值。

每个values目录都包含一个styles.xml,不同之处在于其中包含了默认值。

<style name="listViewActivatedStyle"/>

值-v11包含;

<style name="listViewActivatedStyle">
   <item name="android:background">?android:attr/activatedBackgroundIndicator</item>
</style>

然后,您可以使用一个布局。

style="@style/listViewActivatedStyle"

然后选择合适的一个


9
这似乎有效。当然,现在我已经对样式和整体内容了如指掌,可以在上面写一章,因此我可以在书中更好地解释如何使用这种方法。我不希望这样。:-(但是,感谢您的帮助!
CommonsWare

25
乐意效劳。您的书使我摆脱了足够的知识空缺,我很高兴能够回馈一些东西。
萨顿
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.