如何动态添加图像到ImageView

时间:2011-02-25 19:43:26

标签: android

我正在编写一款益智游戏来学习开发Android应用程序。但现在我仍然坚持如何动态地将图像添加到布局文件中的ImageViews(见下文)。我正在尝试创建一个循环,我在每个ImageViews中添加一个随机图像。但我找不到任何关于如何做到这一点的例子。我的图像与ImageViews的名称相同,只是小写字母。 还是有其他一些更好的方法可以解决这个问题吗?

到目前为止我的代码:

    // Puzzle of 2x2 tiles
    String[] sTiles = {"A0","A1","B0","B1"};
    final Random myRandom = new Random();

    // Random tiles
    String tmp = null;
    for (int i = 0; i < sTiles.length; ++i) {
        tmp = sTiles[i];
        int r = myRandom.nextInt(sTiles.length);
        sTiles[i] = sTiles[r];
        sTiles[r] = tmp;
    }

    // Lopp to add images randomly to the screen (layout/main.xml)
    //for(i=0; i < sTiles.length; ++i) {
         ImageView image = (ImageView) findViewById(R.id.B0);
         image.setImageResource(R.drawable.a0);
    //}

--------------- layout / main.xml ------------

<TableRow>
        <ImageView
            android:id="@+id/A0"
            android:layout_column="1" />
        <ImageView
            android:id="@+id/A1"
            android:gravity="right" />
    </TableRow>
    <TableRow>
        <ImageView
            android:id="@+id/B0" />
        <ImageView
            android:id="@+id/B1" />
    </TableRow>

谢谢,Sigurd!

3 个答案:

答案 0 :(得分:5)

尝试设置一些int数组来存储drawable和widget ID。它比使用反射更快地按名称查找它们。这样的事情可以解决问题:

int[] imageViews = {
    R.id.A0, R.id.A1,
    R.id.B0, R.id.B1,
    R.id.C0, R.id.C1 //...
    };

int[] images = {
    R.drawable.a0, R.drawable.a1,
    R.drawable.b0, R.drawable.b1,
    R.drawable.c0, R.drawable.c1 //...
    };

Random random = new Random(System.currentTimeMillis());

for(int v : imageViews) {
    ImageView iv = (ImageView)findViewById(v);
    iv.setImageResource(images[random.nextInt(images.length - 1)]);
}

如果要确保所有ImageView都获得唯一的图像,您可能需要添加一些特殊处理,但这应该按原样运行。

答案 1 :(得分:0)

您必须制作某种容器(可能是线性或相对布局)并将图像添加到视图中。例如:

   RelativeLayout cbrl = new RelativeLayout(this);
            RelativeLayout.LayoutParams cbp = new RelativeLayout.LayoutParams(
                        LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
                cbVal.setLayoutParams(cbp);

    for(i=0; i < sTiles.length; ++i) {
         ImageView image = (ImageView) findViewById(this);
         image.setImageResource(R.drawable.xX);
cbrl.addView(iv);
    }

答案 2 :(得分:0)

通过反射R.drawable中的值来读取解决方案,并通过获取R中字段的值将其加载为Bitmap。

它类似于:

    public static void example() throws IllegalArgumentException, IllegalAccessException{
        Class<R.drawable> clazz = R.drawable.class;
        for(Field field : clazz.getDeclaredFields()){
            Bitmap bmp = BitmapFactory.decodeResource(getResources(), (Integer) field.get(null));
            //bmp is your image
        }
    }