0

When taping on an ImageView, I want to replace it with other drawable depending on the previous drawable, with some researches I made this:

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

}

The problem is the app always calls to the toast message in default. It ingores all other treatments/verifications in case sections.

Any idea please to solve that problem?

Thank you very much.

4

2 回答 2

2

You probably don't set a drawable id as the tag for the ImageView when you create it, like:

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

and integer becomes 0, avoiding all the switch's cases. Test and see what is the value of integer(I would say it's 0).

You can't set an integer as the tag in xml so the only option is to set it in code, thing that you probably didn't do(at least not in the code you posted).

Another approach:

        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++;
            }
        });
于 2012-07-01T16:50:31.360 回答
2

原因是

你写了以下声明

integer = integer == null ? 0 : integer;

因此,在单击块中第一次达到控制时,时间标签将为空,上面的语句将使其为 0。但是您没有做任何事情来处理 case 0

因此,在每种情况下,您的标签都将为 0,它将导致默认块执行。如果您将标签设置为 0,那么您必须为 0 设置 switch case。否则它将始终为 0,并且默认块继续执行。

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

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

}
于 2012-07-01T16:54:29.937 回答