ImageView没有替换为其他drawable

时间:2012-07-01 16:36:12

标签: android drawable android-imageview

在录制ImageView时,我想将其替换为其他drawable,具体取决于之前的drawable,我做了一些研究:

ImageView imgview = (ImageView) findViewById(R.id.imageView1);
imgview.setOnClickListener(new OnClickListener() {
    public void onClick(View view) {

        ImageView imageView = (ImageView) view;
        assert(R.id.imageView1 == imageView.getId());
        Integer integer = (Integer) imageView.getTag();

        integer = integer == null ? 0 : integer;

        switch (integer) {
        case R.drawable.number1:

            imageView.setImageResource(R.drawable.number2);
            imageView.setTag(R.drawable.number2);
            break;

        case R.drawable.number2:
            imageView.setImageResource(R.drawable.number3);
            imageView.setTag(R.drawable.number3);
            break;

        case R.drawable.number3:
            imageView.setImageResource(R.drawable.number4);
            imageView.setTag(R.drawable.number4);
            break;
        default:
            Toast.makeText(MainActivity.this, "exceeded", Toast.LENGTH_SHORT).show();
        }
    }
});

}

问题是应用程序始终调用toast中的default消息。它会在case部分中进行所有其他处理/验证。

有任何想法请解决这个问题吗?

非常感谢。

2 个答案:

答案 0 :(得分:2)

创建它时,您可能没有将可绘制ID设置为ImageView的标记,例如:

ImageView imgview = (ImageView) findViewById(R.id.imageView1);
imgview.setImageResource(R.drawable.number1);
// ...

并且整数变为0,避免了所有switch的情况。测试并查看整数的值是什么(我会说它是0)。

你不能在xml中设置一个整数作为标记,所以唯一的选择是在代码中设置它,你可能没有做的事情(至少在你发布的代码中没有)。

另一种方法:

        final int[] ids = {R.drawable.number1, R.drawable.number2, R.drawable.number3};     
        b1.setOnClickListener(new OnClickListener() {

            int counter = 0;

            @Override
            public void onClick(View v) {
                if (counter % 3 == 0) {
                    v.setBackgroundResource(ids[0]);
                } else if (counter % 3 == 1){
                    v.setBackgroundResource(ids[1]);
                } else if (counter % 3 == 2){
                    v.setBackgroundResource(ids[2]);
                }
                counter++;
            }
        });

答案 1 :(得分:2)

原因是

您已撰写以下声明

integer = integer == null ? 0 : integer;

因此,第一次在click块中达到控制,时间标记将为null,而上述语句将使其为0. 但是您无法处理案例0

因此,在每种情况下,您的标记都将为0,这将导致默认块执行。如果您将标记设置为0,则必须将开关大小写为0.否则,它将始终为0,并且默认块将继续执行。< / p>

您的代码段应该如下所示。

ImageView imgview = (ImageView) findViewById(R.id.imageView1);
imageView.setImageResource(R.drawable.number1);
imageView.setTag(R.drawable.number1);

imgview.setOnClickListener(new OnClickListener() {
    public void onClick(View view) {

        ImageView imageView = (ImageView) view;
        assert(R.id.imageView1 == imageView.getId());
        Integer integer = (Integer) imageView.getTag();

        switch (integer) {
        case R.drawable.number1:

            imageView.setImageResource(R.drawable.number2);
            imageView.setTag(R.drawable.number2);
            break;

        case R.drawable.number2:
            imageView.setImageResource(R.drawable.number3);
            imageView.setTag(R.drawable.number3);
            break;

        case R.drawable.number3:
            imageView.setImageResource(R.drawable.number4);
            imageView.setTag(R.drawable.number4);
            break;
        default: 
            Toast.makeText(MainActivity.this, "exceeded", Toast.LENGTH_SHORT).show(); 
            imageView.setImageResource(R.drawable.number1);  <----You should reset it to number 1
            imageView.setTag(R.drawable.number1);
        }
    }
});

}