我正在尝试为我的应用程序创建Android库模块(API 21+),它将实现跨各种应用程序共享的一些业务逻辑。 问题是我想在这个库模块中声明属性,为此我将能够在上述项目的app模块中设置值。
有趣的是,我当前的解决方案适用于模拟器,但不适用于物理设备。
以下是我现在的方法(简化,不相关的部分省略):
图书馆的attrs.xml:
<resources>
<attr name="lib_Background" format="reference"/>
<attr name="lib_Logo" format="reference"/>
</resources>
Applications styles.xml:
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="lib_Background">@drawable/back</item>
<item name="lib_Logo">@drawable/logo</item>
</style>
我是否尝试从xml的库布局访问这些资源并不重要:
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="?attr/lib_Background"
android:scaleType="centerCrop"/>
或以编程方式这样:
fun Context.getDrawableFromAttributes(idOfAttribute: Int): Drawable? {
val a = this.theme.obtainStyledAttributes(intArrayOf(idOfAttribute))
val resourceId = a.getResourceId(0, 0)
a.recycle()
return this.resources.getDrawable(resourceId, this.theme)
}
我仍然在模拟器上正确加载此图像,但物理设备上的“null”。
有没有更好或正确的方法来实现这个目标?
答案 0 :(得分:0)
我有点忘记了这个问题。
问题是我为一种特定的密度使用了损坏的PNG,导致它为空。因此完全没有错误,而且实施中完全没有错误,这种方法绝对有效。