19

我在我的应用程序中定义了主题和样式。图标(可绘制)使用样式文件中的引用定义为

<attr name="myicon" format="reference" />

和风格

<style name="CustomTheme" parent="android:Theme.Holo">
    <item name="myicon">@drawable/ajout_produit_light</item>

我需要以编程方式检索可绘制对象以在对话框片段中使用好的图像。如果我喜欢

mydialog.setIcon(R.style.myicon);

我得到一个 id 等于 0,所以没有图像

我尝试使用类似的东西

int[] attrs = new int[] { R.drawable.myicon};
TypedArray ta = getActivity().getApplication().getTheme().obtainStyledAttributes(attrs);
Drawable mydrawable = ta.getDrawable(0);
mTxtTitre.setCompoundDrawables(mydrawable, null, null, null);

我尝试了类似的不同方法,但结果始终为 0 或 null :-/

我该怎么做?

4

4 回答 4

21

我找到了 在主题和 attrs.xml android 中定义的访问资源的解决方案

TypedArray a = getTheme().obtainStyledAttributes(R.style.AppTheme, new int[] {R.attr.homeIcon});     
int attributeResourceId = a.getResourceId(0, 0);
Drawable drawable = getResources().getDrawable(attributeResourceId);
于 2013-03-11T13:23:15.433 回答
12

Kotlin 解决方案:

val typedValue = TypedValue()
context.theme.resolveAttribute(R.attr.yourAttr, typedValue, true)
val imageResId = typedValue.resourceId
val drawable = ContextCompat.getDrawable(context, imageResId) ?: throw IllegalArgumentException("Cannot load drawable $imageResId")
于 2019-08-27T19:03:44.233 回答
1

假设您的上下文(活动)以您想要的方式为主题,您可以resolveAttribute在主题上使用:

TypedValue themedValue = new TypedValue();
this.getTheme().resolveAttribute(R.attr.your_attribute, themedValue, true);
myView.setBackgroundResource(themedValue.resourceId);

所以在你的情况下,它看起来像这样:

TypedValue themedValue = new TypedValue();
this.getTheme().resolveAttribute(R.attr.myicon, themedValue, true);
Drawable mydrawable = AppCompatResources.getDrawable(this, themedValue.resourceId);
mTxtTitre.setCompoundDrawables(mydrawable, null, null, null);

在示例this中将是您的活动。如果您不在活动中,请获取有效的上下文

于 2021-09-14T12:03:46.840 回答
-1

似乎您正在尝试使用资源设置 myDialog 的图标并尝试通过 R.style 访问它,但您的其他代码段让我相信您拥有位于 R.drawable 中的资源

考虑到这一点,您应该能够使用 myDialog.setIcon(R.drawable.myicon); 获得所需的效果。

于 2013-03-11T13:26:32.770 回答