当 appTheme 从 styles.xml 选择为 "theme1" 时,如何使用不同的 drawable res 文件夹(例如 drawable-theme1)?这可能吗?
How to use a different drawable res folder (for eg. drawable-theme1) when the appTheme is selected as "theme1" from styles.xml? Is this possible?
目前我的 styles.xml 文件中有四个主题。 (主题 1、主题 2、主题 3、主题 4)。
我在 drawable 和 drawable-theme1[=30= 中都有 test_image.xml ] 文件夹。
我需要的是,仅 theme1,我需要来自 drawable-theme1 的资源,以及其他主题(theme2、theme3 , theme4), 我需要普通可绘制文件夹中的资源。
最后,在以编程方式设置图像视图时,我将调用 imageView.setResource(R.drawable.test_image)。必须根据我选择的主题来获取资源文件。
这是否可能?
我找不到任何与此相关的问题或类似问题。如果有人已经提供了解决方案,请帮我找到那个。谢谢
您不能将<themeName>
用作qualifier。
这意味着您不能使用drawable-themeName
文件夹。
但是您可以在 attrs.xml
文件中定义自定义属性:
<resources>
<attr name="myDrawable" format="reference" />
</resources>
然后在styles.xml
在应用主题中你可以定义它:
<style name="AppTheme1" parent="Theme.MaterialComponents.DayNight">
<!-- ..... -->
<item name="myDrawable">@drawable/ic_add_24px</item>
</style>
最后在布局中你可以使用类似的东西:
<com.google.android.material.button.MaterialButton
....
app:icon="?attr/myDrawable"/>
或以编程方式:
MaterialButton button = findViewById(R.id.button);
TypedValue typedValue = new TypedValue();
getTheme().resolveAttribute(R.attr.myDrawable, typedValue, true);
button.setIcon(ContextCompat.getDrawable(this,typedValue.resourceId));
目前我的 styles.xml 文件中有四个主题。 (主题 1、主题 2、主题 3、主题 4)。
我在 drawable 和 drawable-theme1[=30= 中都有 test_image.xml ] 文件夹。
我需要的是,仅 theme1,我需要来自 drawable-theme1 的资源,以及其他主题(theme2、theme3 , theme4), 我需要普通可绘制文件夹中的资源。
最后,在以编程方式设置图像视图时,我将调用 imageView.setResource(R.drawable.test_image)。必须根据我选择的主题来获取资源文件。
这是否可能?
我找不到任何与此相关的问题或类似问题。如果有人已经提供了解决方案,请帮我找到那个。谢谢
您不能将<themeName>
用作qualifier。
这意味着您不能使用drawable-themeName
文件夹。
但是您可以在 attrs.xml
文件中定义自定义属性:
<resources>
<attr name="myDrawable" format="reference" />
</resources>
然后在styles.xml
在应用主题中你可以定义它:
<style name="AppTheme1" parent="Theme.MaterialComponents.DayNight">
<!-- ..... -->
<item name="myDrawable">@drawable/ic_add_24px</item>
</style>
最后在布局中你可以使用类似的东西:
<com.google.android.material.button.MaterialButton
....
app:icon="?attr/myDrawable"/>
或以编程方式:
MaterialButton button = findViewById(R.id.button);
TypedValue typedValue = new TypedValue();
getTheme().resolveAttribute(R.attr.myDrawable, typedValue, true);
button.setIcon(ContextCompat.getDrawable(this,typedValue.resourceId));