声明可以通过app修改的库模块的属性

时间:2018-02-07 16:14:08

标签: android android-layout

我正在尝试为我的应用程序创建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”。

有没有更好或正确的方法来实现这个目标?

1 个答案:

答案 0 :(得分:0)

我有点忘记了这个问题。

问题是我为一种特定的密度使用了损坏的PNG,导致它为空。因此完全没有错误,而且实施中完全没有错误,这种方法绝对有效。