在向后兼容的应用程序中使用 ?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

【问题讨论】:

不幸的是dividerHorizo​​ntal样式在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/dividerHorizo​​ntal

最简单的方法是在需要的地方使用以下代码

<!-- 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/dividerHorizo​​ntal" 横跨整个屏幕宽度。 我想要具有该边距的水平线。它没有必要有任何保证金。你可以删除它。【参考方案2】:

与documentation 一样,某些样式在更高的 API 中。例如:

dividerVertical 从 API 11 开始 dividerHorizontal 从 API 11 开始

? 标记用于引用当前主题中的样式。

要解决您的问题,您可以:

使用 API 11 中的样式,但将它们放在 values-v11 文件夹中,并使用自定义值或旧 API 中的不同属性支持 values 中旧版本的样式。 从 ICS 复制必要的样式 不要使用这些样式 使用自定义样式

这取决于你的目标是什么。当应用程序的原生风格对您很重要时,第一个建议是有意义的。 如果你想在任何地方都有 Holo 风格,那么没有办法复制它并作为所有平台的一种风格。 看看这个项目:https://github.com/Prototik/HoloEverywhere

【讨论】:

您的第一个建议是否有示例?我认为在 v11+ 上引用本机样式是最好的,但我不确定我需要在不同的 valuesvalues-v11 样式定义中添加什么才能传递到 v11 的普通 Holo 资源并具体定义(我猜是复制 Holo 资源)以获得兼容性版本。【参考方案3】:

请检查 android support v7 - appcompat 项目。它有许多向后兼容的主题和属性(attr/dividerHorizo​​ntal 也是)

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/的主要内容,如果未能解决你的问题,请参考以下文章

为啥在向后滑动时自动旋转无法正常工作?

pytorch 在向后()中崩溃并冻结屏幕,你能帮帮我吗?

django 在向后迁移/ loaddata 后从夹具加载数据使用的是模型模式而不是数据库模式

axios.get() 在向后端发送请求时正在组合 url。

UIRefreshControl 向后兼容

我的OpenGL学习进阶之旅OpenGL ES 3.0和向后兼容性