21

我知道仅使用更改 ImageView 资源并不是什么大不了的事myImageView.setImageResource(mynewImageDrawable)

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

基本上,我想使用 imageViews 实现我自己的组单选按钮。所以每次点击任何 imageView 时,onclicked 事件方法都会改变我组的图像资源。

并为我糟糕的英语感到抱歉。

问候,红海

4

7 回答 7

32

没有getDrawableId功能,因此您需要在ImageView更改其可绘制对象时执行诸如设置标签之类的操作。例如,将drawable id设置为标签,ImageView这样你就可以从标签中获取drawable id。

怎么做?

我会说 90% 的时间,你的视图上不会有任何标签,所以最简单的方法是假设你的标签是唯一的标签:

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

如果我的视图中已经有标签怎么办

Android 视图可以同时托管多个标签,只要它们具有唯一标识符即可。您需要创建一个唯一的 id资源并将其作为第一个参数添加到setTag方法调用中。留下这样的代码:

myImageView.setTag(R.id.myTagId, R.drawable.currentImage); //Set
int drawableId = (Integer)myImageView.getTag(R.id.myTagId);
于 2012-05-23T19:27:39.403 回答
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 
于 2020-04-08T11:35:22.547 回答
1

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

并不是说您提出的建议行不通,它只是设计不佳并导致可维护性差(例如,如果资源名称发生更改)。

于 2012-05-23T19:41:21.700 回答
1

实际上,经过我的尝试,我发现有一种方法可以在不需要标签属性的情况下获取 imageView 的来源。

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

第一个参数是命名空间,androidsrc属性名。此方法如果找到则返回图像资源 ID,否则将返回 -1;

于 2014-10-13T12:20:02.217 回答
1

如果你想得到srcdrawable,使用以下方法:http ImageView: //developer.android.com/reference/android/widget/ImageView.html#getDrawable()

于 2014-10-29T14:27:03.800 回答
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"));
于 2017-01-27T14:24:02.293 回答
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);
    }

}
于 2019-06-05T12:34:43.717 回答