0

をテーピングするときImageView、以前のドローアブルに応じて他のドローアブルに置き換えたいと思います。いくつかの調査でこれを行いました。

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ます。

その問題を解決するためのアイデアはありますか?

どうもありがとうございます。

4

2 に答える 2

2

その理由は

あなたは次の声明を書きました

integer = integer == null ? 0 : integer;

したがって、クリックブロックで初めてコントロールに到達すると、タイムタグはnullになり、上記のステートメントは0になります。ただし、ケース0を処理するために何もしていません

したがって、いずれの場合もタグは0になり、デフォルトのブロックが実行されます。タグを0に設定する場合は、0のスイッチケースが必要です。それ以外の場合は、常に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 に答える
2

ImageView次のように、作成時にドローアブルIDをタグとして設定しない可能性があります。

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

整数はになり、すべての'sの場合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++;
            }
        });
于 2012-07-01T16:50:31.360 に答える