如何以编程方式为存储在变量中的按钮添加 android 可绘制文件的值?

How to add value for android drawable file for button stored in a varible programatically?

我希望使用以下方法动态更改按钮右侧的图像,它按原样工作。

<Button
    android:id="@+id/buttonIdDoesntMatter"
    android:layout_height="wrap_content"
    android:layout_width="fill_parent"
    android:text="buttonName"
    android:drawableLeft="@drawable/frog"
    android:onClick="listener"
    android:layout_width="fill_parent">
</Button>

以下检索按钮图像的方法对我有用,其中 frog 是图像名称。

button.setCompoundDrawablesWithIntrinsicBounds( 0, 0, R.drawable.frog,0);

但我正在尝试根据用户使用共享首选项接受的选项来检索图像。所以我将每个图标名称存储为键值形式的值,并检索用户选择的每个键的值并将它们作为文件名传递给 drawable。

 <string-array name="pref_icon_title">

        <item>camel</item>
        <item>forg</item>
  </string-array>
  

//值对应原图名

    </string-array>
    <string-array name="pref_icon_values">
        <item>camel</item>
        <item>forg</item>
      
        <item></item>
    </string-array>

在检索用户选择的值并将它们传递给可绘制对象时,它给出了错误并且不知道如何传递..我正在使用 String.valueOf(变量),它不起作用

不接受使用 String.valueOf 传递检索到的变量。任何建议将不胜感激。

button.setCompoundDrawablesWithIntrinsicBounds( 0, 0, R.drawable.String.valueOf(variable),0);

如果我没理解错的话,你是想通过名称获取可绘制对象的 ID 吗?

您可以使用 Resource class 实现此目的,尤其是 getIdentifier 函数(它将 return 给定资源名称的资源标识符)

用法

public int getIdentifier (String name, 
                          String defType, 
                          String defPackage)

所以在你的情况下,你应该有类似的东西:

int resourceID = getResources().getIdentifier(
    variable,
    "drawable",
    getPackageName()
);
button.setCompoundDrawablesWithIntrinsicBounds( 0, 0, resourceID, 0);

如果您不在任何 activity 中,那么您必须传递上下文而不是资源作为参数,然后执行此操作

int resourceID = context.getResources().getIdentifier(
    variable,
    "drawable",
    context.getPackageName()
);
button.setCompoundDrawablesWithIntrinsicBounds( 0, 0, resourceID, 0);

注意 getIdentifier() Returns 0 如果没有找到这样的资源。 (0 不是有效的资源 ID。)