如何从drawable文件夹动态获取图片

49
我有这样一个数组。
int image[] = {R.drawable.d002_p001,R.drawable.d002_p002,R.drawable.d002_p003,
                   R.drawable.d002_p004,R.drawable.d002_p005,R.drawable.d002_p006};

现在我有6张图片,所以我静态地给出了名称。

如果我有大约50张图片,我不能在数组中给出每个文件名,所以它需要是动态的,我该如何实现呢?


请查看此教程,希望能对您有所帮助! - Sanjay D
10个回答

117

您可以使用 getIdentifier() 方法。

for (int j = 1; j < 6; j++) {
   Drawable drawable = getResources().getDrawable(getResources()
                  .getIdentifier("d002_p00"+j, "drawable", getPackageName()));
}

如何将drawable保存到字符串数组中? - Srujan Barai
需要API级别21才能获取getDrawable。 - The Student
1
@TomBrito 使用ContextCompat.getDrawable(context, res)。请参见https://dev59.com/iWsz5IYBdhLWcg3wj4kc#34132342。 - SleepProgger
如果您正在寻找扩展名为“.jpg”的任何文件,并且文件数量未知,您会如何处理?@LalitPoptani - Pj Rigor

13

你也可以使用这个:

int res = getResources().getIdentifier("<your pakecgename>:drawable/abc", null, null);

使用"drawable", getPackageName()代替null, null更少出错。 - OneCricketeer

7

像这样的东西可能会起作用

Field[] drawables = android.R.drawable.class.getFields();
for (Field f : drawables) {
    try {
        System.out.println("R.drawable." + f.getName());
    } catch (Exception e) {
        e.printStackTrace();
    }
}

这个代码段对我来说很有用,可以获取所有的可绘制对象。我将它们全部放在一个哈希表中,以便以后更轻松地访问:KEY=f.getInt(f.getName()) + VALUE=f.getName() - user4500
只是一个小技巧,使用你的类名代替Android。我浪费了好几个小时。 - Prvt_Yadav

5

使用以下代码动态获取Drawable:

Drawable drawable = this.getResources().getDrawable(R.drawable.yourDrawableID);

这将为您提供所需的Drawable。

"yourDrawableID" 是您在布局(XML)文件中指定元素的实际"ID"值。 - uniruddh

2
public static Drawable getImage(Context context, String name) {
        return context.getResources().getDrawable(context.getResources().getIdentifier(name, "drawable", context.getPackageName()));
}

2
String[] names = new String []{"yout names..."};
    for(String n: names) {
        Utils.GetDrawableByName(n,this);
    }

public class Utils {
public static Drawable GetDrawableByName(String name,Activity context){
    Resources res = context.getResources();
    return res.getDrawable(res.getIdentifier(name,"drawable",context.getPackageName()));
    }
}

1
package com.example.studio.snakes;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;

import java.util.Random;

public class MainActivity extends AppCompatActivity {

int[] dices = {
        R.drawable.one,
        R.drawable.two,
        R.drawable.three,
        R.drawable.four,
        R.drawable.five,
        R.drawable.six,
};


public void rollTapped(View view){
 Log.i("Button","Button Tapped");
    Random rand = new Random();
    int randomnum = rand.nextInt(6);
    Log.i("Random","Random number is " + randomnum );
    ImageView dice=findViewById(R.id.imageView2);
    dice.setImageResource(dices[randomnum]);


}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}
}

这里我创建了一个名为dices的数组,用于存储drawable文件夹中的图像。通过生成随机变量randnum(来自代码),我随机访问这些图像。每次生成随机数时,我都会更改已存在的图像(在代码中id为imageView2)。每当我们点击按钮时,图像将被随机生成。 - Anwar shanib

0

我们可以利用ImageView的setImageResource方法,因为这比drawable更有效率,下面的代码可以参考。

以下代码可用于显示像gif一样的图像,如果您有多个gif的分割图像,则只需从在线工具中拆分gif并按以下顺序将图像放入drawable中:

image_1.png,image_2.png等。

使用handler动态更改图像。

int imagePosition = 1;
    Handler handler = new Handler();
        Runnable runnable = new Runnable() {
            public void run() {
                updateImage();
            }
        };




    public void updateImage() {

                appInstance.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        int resId = getResources().getIdentifier("image_" + imagePosition, "drawable", appInstance.getPackageName());
                        gifImageViewDummy.setImageResource(resId);
                        imagePosition++;
    //Consider you have 30 image for the anim
                        if (imagePosition == 30) {
//this make animation play only once
                            handler.removeCallbacks(runnable);

                        } else {
    //You can define your own time based on the animation
                            handler.postDelayed(runnable, 50);
                        }

//to make animation to continue use below code and remove above if else
// if (imagePosition == 30)
//imagePosition = 1;
// handler.postDelayed(runnable, 50);
// 
                    }
                });
              }

0

Kotlin 的扩展函数

fun Activity.getDrawable(drawableName: String): Drawable? {
    val drawableId = resources
        .getIdentifier(drawableName, "drawable", packageName)

    if (drawableId != 0) {
        return ResourcesCompat.getDrawable(resources, drawableId, null)
    }
    return null
}

-10
使用这段代码创建数组,然后稍后使用该数组。
int NUM_OF_IMAGES = 50;
String images[] = new String[NUM_OF_IMAGES];
for (int i =0; i < NUM_OF_IMAGES; i++) {
    images[i] = "R.drawable.d002_p00" + i;
}

你需要注意的主要事项是文件名必须以"d002_p00"开头,之后跟着数字1到50。


1
它显示了一个错误,伙计:“R.drawable.d002_p00”+i; 无法从整数转换为字符串。 - Goofy
5
这个答案太糟糕了... 你学过Java吗?一个String不能赋值给一个int变量... 而且如果不使用String.valueof(),一个int也不能添加到一个字符串中... - maysi
先生,dilipkaklotar的某些代码有误,请在此更改并更新您的帖子。 - Ramani Hitesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接