在向后兼容的应用程序中使用 ?android:attr/
Posted
技术标签:
【中文标题】在向后兼容的应用程序中使用 ?android:attr/【英文标题】:Usage of ?android:attr/ in backwards compatible apps 【发布时间】:2012-07-08 03:24:36 【问题描述】:我正在尝试使我的 ICS(API 级别 15)应用程序与 Gingerbread(API 级别 10)兼容,并且对于任何具有 ?android:attr/
属性的布局 XML,我都会收到 InflateException Error inflating class <Unknown>
。如果我注释掉这些属性,我可以编译并运行应用程序,但它当然看起来很棒。
我宁愿不复制我正在使用的 android.R.attr
中的所有项目,但目前我迷失了另一种方法。
我正在使用 ActionBarSherlock 来让 ActionBar 工作,而且我似乎没有使用任何其他需要支持库的东西(尽管我在尝试解决这个问题的过程中已经包含了它),它只是这些我坚持的基于主题的资源。
我正在使用的一些主题资源是:
?android:attr/textColorSecondaryInverse
?android:attr/textAppearanceLarge
?android:attr/dividerVertical
?android:attr/selectableItemBackground
?android:attr/textAppearanceMedium
?android:attr/dividerVertical
?android:attr/dividerHorizontal
【问题讨论】:
不幸的是dividerHorizontal样式在ABS中没有定义(我的版本是4.1.0)。也许是因为它只涵盖了 ActionBar 使用的样式)。实际上定义了dividerVertical。很郁闷的是ABS主题没有涵盖所有的原创风格! @WindRider 不要误导他人。在 Android 源代码中检查 2 lines。这是简单的 1x1 九补丁 png。 ActionBarSherlock 也是如此。但它没有添加别名dividerHorizontal
【参考方案1】:
使用 API 11 中的样式特别是 android:attr/textAppearanceMedium ?android:attr/dividerVertical ?android:attr/dividerHorizontal
最简单的方法是在需要的地方使用以下代码
<!-- For Horizontal Line-->
<View
android:layout_
android:layout_
android:layout_marginLeft="4dip"
android:layout_marginRight="4dip"
android:background="#aaa"
android:layout_alignParentTop="true"/>
<!-- For Vertical Line-->
<View
android:id="@+id/VerticalLine"
android:layout_
android:layout_
android:layout_marginBottom="4dip"
android:layout_marginTop="4dip"
android:background="#aaa"/>
【讨论】:
完美解决方案。但是为什么需要marginLeft 和marginRight?属性 android:divider="?android:attr/dividerHorizontal" 横跨整个屏幕宽度。 我想要具有该边距的水平线。它没有必要有任何保证金。你可以删除它。【参考方案2】:与documentation 一样,某些样式在更高的 API 中。例如:
dividerVertical
从 API 11 开始
dividerHorizontal
从 API 11 开始
?
标记用于引用当前主题中的样式。
要解决您的问题,您可以:
使用 API 11 中的样式,但将它们放在values-v11
文件夹中,并使用自定义值或旧 API 中的不同属性支持 values
中旧版本的样式。
从 ICS 复制必要的样式
不要使用这些样式
使用自定义样式
这取决于你的目标是什么。当应用程序的原生风格对您很重要时,第一个建议是有意义的。 如果你想在任何地方都有 Holo 风格,那么没有办法复制它并作为所有平台的一种风格。 看看这个项目:https://github.com/Prototik/HoloEverywhere
【讨论】:
您的第一个建议是否有示例?我认为在 v11+ 上引用本机样式是最好的,但我不确定我需要在不同的values
和 values-v11
样式定义中添加什么才能传递到 v11 的普通 Holo 资源并具体定义(我猜是复制 Holo 资源)以获得兼容性版本。【参考方案3】:
请检查 android support v7 - appcompat 项目。它有许多向后兼容的主题和属性(attr/dividerHorizontal 也是)
http://developer.android.com/tools/support-library/features.html#v7-appcompat
要使用 v7 支持,您必须将其作为 Android 库项目导入并从您的项目中引用它。它还包含 v4 支持,因此您可能希望在 libs 文件夹中删除 v4 支持 :) 祝你好运!!
【讨论】:
我认为这是不可能的。 attr 存在,但不能保证垂直分隔线的可绘制对象。 绘图(包括垂直分隔线)也包含在 v7 支持项目中,以及 xml attr 值:)。 请见谅。我看不到可绘制的垂直分隔线。它在 res/drawable-mdpi/abc_list_divider_holo_(dark/light).9.png 我不能:(。我试过删除投票但它被锁定了。我试图编辑它但它会工作:(。对不起。以上是关于在向后兼容的应用程序中使用 ?android:attr/的主要内容,如果未能解决你的问题,请参考以下文章
django 在向后迁移/ loaddata 后从夹具加载数据使用的是模型模式而不是数据库模式