【问题标题】:how to get images dynamically from drawable folder如何从可绘制文件夹中动态获取图像
【发布时间】:2012-02-27 17:26:08
【问题描述】:

我有一个这样的数组。

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 张图像,我无法在数组中给出每个文件名,所以它需要是动态的,我该如何实现这一点。

【问题讨论】:

  • 看看这个Tutorial希望对你有帮助!!

标签: android drawable android-resources


【解决方案1】:

您可以使用getIdentifier()

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

【讨论】:

  • 如何从 drawable 保存到字符串数组?
  • getDrawable 需要 API 级别 21
  • @TomBrito 使用 ContextCompat.getDrawable(context, res)。见stackoverflow.com/a/34132342/4830897
  • 如果您正在查找任何扩展名为“.jpg”的文件并且文件数量未知,您将如何执行此操作? @LalitPoptani
【解决方案2】:

你也可以这样用:

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

【讨论】:

  • 使用"drawable", getPackageName() 而不是null, null 更不容易出错
【解决方案3】:

这样的东西可以工作

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

【讨论】:

  • 这匹配我获得所有可绘制对象。我将所有内容放在一个 Hashmap 中,以便以后访问: KEY=f.getInt(f.getName()) + VALUE=f.getName()
  • 只是提示使用你的类名在 android 的地方。我浪费了几个小时。
【解决方案4】:

使用以下行来动态获取可绘制对象:

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

这将为您提供所需的 Drawable。

【讨论】:

  • yourDrawableID 是您在 layout(xml) 文件中为元素指定的实际 ID 值。
【解决方案5】:
public static Drawable getImage(Context context, String name) {
        return context.getResources().getDrawable(context.getResources().getIdentifier(name, "drawable", context.getPackageName()));
}

【讨论】:

    【解决方案6】:
    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()));
        }
    }
    

    【讨论】:

      【解决方案7】:
      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);
      }
      }
      

      【讨论】:

      • 在这里我为可绘制文件夹中的图像创建了数组骰子。我通过生成名为 randnum 的随机变量(来自代码)随机访问图像。在这里我继续更改已经存在的图像(id是代码中的imageView2)每个随机数。每当我们点击一​​个按钮时,图像都会随机生成
      【解决方案8】:

      我们可以利用 Imageview setImageResource,因为这比 drawable 看起来更有效,请参考下面的代码。

      如果您有 gif 的多个拆分图像,则以下代码可用于显示类似 gif 的图像。只需从在线工具将 gif 拆分为单独的 png,然后将图像放入 drawable 中,如下所示

      image_1.png、image_2.png 等

      让处理程序动态更改图像。

      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);
      // 
                          }
                      });
                    }
      

      【讨论】:

        【解决方案9】:

        使用此代码创建数组,然后使用该数组

        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

        【讨论】:

        • 它向我显示错误花花公子 "R.drawable.d002_p00" +i;无法从 int 转换为 string
        • 这个答案真的很糟糕……你学过java吗?? String 不能分配给 int 变量...并且不使用 String.valueof() 就不能将 int 添加到字符串...
        • Mr.dilipkaklotar 一些代码错误,所以在这里更改我们并更新您的帖子
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多