如何获取ImageView的源代码才能改变它?

时间:2012-05-23 19:24:09

标签: android imageview drawable

我知道只使用myImageView.setImageResource(mynewImageDrawable)

更改ImageView资源并不重要

但我想要做的是在更改之前检查当前的ImageSource。

基本上,我想使用imageViews实现我自己的组单选按钮。因此,每次单击任何imageView时,oncliked事件方法都将更改我的组的图像资源。

抱歉我的英语不好。

的问候, redsea

7 个答案:

答案 0 :(得分:26)

没有getDrawableId功能,因此您需要在更改其drawable时为ImageView设置标记。例如,将drawable id设置为ImageView的标记,这样您就可以从标记中获取可绘制的id。

怎么做?

我会说90%的时间,你的观点都没有任何标签,所以最简单的方法是假设你的标签是唯一的标签:

myImageView.setTag(R.drawable.currentImage);    //When you change the drawable
int drawableId = (Integer)myImageView.getTag(); //When you fetch the drawable id

如果我的视图中已有标记

,该怎么办?

Android视图可以同时托管多个标记,只要它们具有唯一标识符即可。您需要create a unique id资源并将其添加为setTag方法调用的第一个参数。离开这样的代码:

myImageView.setTag(R.id.myTagId, R.drawable.currentImage); //Set
int drawableId = (Integer)myImageView.getTag(R.id.myTagId);

答案 1 :(得分:2)

要获取图像源,可以使用Drawable.ConstantState。 例如,在我的问题中,我实现了单击按钮以更改ImageView。 我创建了两个Drawable.ConstantState对象并进行了比较。 代码如下:

ImageView myImg=(ImageView) findViewById(R.id.myImg);
        Drawable.ConstantState imgID = myImg.getDrawable().getConstantState();
        Drawable.ConstantState imgID2 = getDrawable(R.drawable.otherImage).getConstantState();
        if(imgID!=imgID2)
        {
            // Block of Code
        }
        else // Other Block of Code 

答案 2 :(得分:1)

您是说要检查资源ID以确定是否选择了单选按钮?虽然这可能有用,但它不是一个很好的设计。一般来说,您希望将模型与视图分开(也称为Model-View-Controller范例)。为此,您可以让单选按钮组维护所选项目的索引,并将每个项目存储在列表中。选择项目后,您可以确定其索引,更新组的模型,然后更新UI以反映该更改。

它并不是你提议的不会工作,它只是不好的设计并导致可维护性差(例如资源名称改变)。

答案 3 :(得分:1)

尝试后,我发现有一种方法可以获得imageView的源代码而不需要标签属性。

Integer src = attrs.getAttributeResourceValue(
                    "http://schemas.android.com/apk/res/android", "src", -1);

第一个参数是android的命名空间,src是属性名称。 此方法返回图像资源ID(如果找到)或返回-1;

答案 4 :(得分:1)

如果您想获得src drawable,请使用ImageView的以下方法: http://developer.android.com/reference/android/widget/ImageView.html#getDrawable()

答案 5 :(得分:0)

你可以用它。

 private Drawable colocaImgen(String nombreFile) {
    Drawable res1 = null;
    String uri1 = null;
    try {
        //First image
        uri1 = "@drawable/" + nombreFile;
        int imageResource1 = getResources().getIdentifier(uri1, null,getApplicationContext().getPackageName());
        res1 = getResources().getDrawable(imageResource1);
    } catch (Exception e) {
        // TODO Auto-generated catch block
        //int imageResource1 = context.getResources().getIdentifier(uri1, null, context.getApplicationContext().getPackageName());
        res1 = getResources().getDrawable(R.drawable.globo2);// Default image
    }
    return res1;
}

然后

((ImageView) findViewById(R.id.youNameFile)).setImageDrawable(colocaImgen("NameFile"));

答案 6 :(得分:0)

我遇到了同样的问题,这是我的工作解决方案:

public void engLayoutExpand(View view) {
    ImageView iv = (ImageView) view;

    // One way:
    Bitmap bm1 = ((BitmapDrawable) iv.getDrawable()).getBitmap();
    Bitmap bm2 = ((BitmapDrawable) getResources().getDrawable(R.drawable.baseline_expand_less_black_36)).getBitmap();

    if (bm1 == bm2) {
        iv.setImageResource(R.drawable.baseline_expand_more_black_36);
    }

    // Other way
    Drawable.ConstantState cs1 = iv.getDrawable().getConstantState();
    Drawable.ConstantState cs2 = getResources().getDrawable(R.drawable.baseline_expand_less_black_36).getConstantState();

    if ( cs1 == cs2) {
        iv.setImageResource(R.drawable.baseline_expand_more_black_36);
    }

}