Android number1.setImageResource(R.drawable.n+"1");解释

Android number1.setImageResource(R.drawable.n+"1"); Explanation

尽可能避免这种情况。退后一步,重新考虑您是否真的需要这样做,因为这是一项昂贵的操作,而且可能有更好的方法。

您可以使用方法将字符串转换为int标识符:

public static int getStringIdentifier(Context context, String name) {
    return context.getResources().getIdentifier(name, "drawable", context.getPackageName());
}

传入一个 activity 作为上下文参数(或任何其他上下文实例)。然后您可以像往常一样通过 getString() 方法使用标识符。

请注意,从字符串到标识符的转换使用反射,因此可能不会那么快,因此请谨慎使用。 参考:This SO post

使用示例:number1.setImageResource(getStringIdentifier(this,String.valueOf(n+rnd)));

方法 setImageResource 需要生成并存储在 R 文件中的整数,因此将字符串附加到该方法是行不通的。

幸运的是,Android 确实提供了一个名为 getIdentifier

的方法来使用

getResources().getIdentifier("n1", "drawable", this.getPackageName());

虽然这个方法很慢,所以如果你多次调用它,最好在开始时将所有资源加载为位图,然后将 ImageView 资源设置为你需要的任何位图时间

Bitmap[] numbers = new Bitmap[9]   
for(int i=1; i<=9; i++) {
    numbers[i] = BitmapFactory.decodeResource(getResources(), getResources().getIdentifier(("n"+i), "drawable", this.getPackageName()););
}

然后你可以做一个方法来调用

private void setNumber(int i) {
    image.setImageBitmap(numbers[i]);
}

如果您只使用这 9 个可绘制对象,只需创建一个数组来保存这些可绘制对象的资源 ID 值。

static final int[] RESOURCE_IDS = {
    0, // empty value so that i = 1 corresponds to R.drawable.n1
    R.drawable.n1,
    ...
    R.drawable.n9
};

Random rand = new Random();
int resourceId = RESOURCE_IDS[rand.nextInt(9)+1]; // random integer from 1-9
mImageView.setImageResource(resourceId);