0

私は非常に簡単な質問があります。私は Java に非常に慣れていないので、些細なことでしたら申し訳ありません。

私のアプリケーションのある状況では、一連の CheckBox のそれぞれをチェックするために同じ数のポイントを取得します。それぞれに OnClickListener を設定することもできますが、これは洗練されていない解決策のように思えるので、代わりに「これらの CheckBox のいずれかをチェックしても同じ結果が得られる」というコードを書きたいと思います。

残念ながら、私が書いたものは機能しません。

int[] ids = {R.id.cmCheckBox1, R.id.cmCheckBox2, R.id.cmCheckBox3, R.id.cmCheckBox4, R.id.cmCheckBox5, R.id.cmCheckBox6, R.id.ctCheckBox1, R.id.ctCheckBox2, R.id.ctCheckBox3};
final CheckBox[] checkBoxes = new CheckBox[ids.length];
for (int i = 0; i < ids.length; ++i) {
    checkBoxes[i] = (CheckBox) findViewById(ids[i]);
    checkBoxes[i].setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            if (checkBoxes[i].isChecked()) {
                Global.score += 5;
            } else {
                Global.score -= 5;
            }
        }
    });
}

このコードでは、次のエラー メッセージが表示されます。

"Cannot refer to a non-final variable i in an inner class defined in a different method".

最終変数を変更できないため、 3行目をfor (final int i = 0; i < ids.length; ++i) {変更しても役に立ちませんか?

どんな提案でも大歓迎です!

4

2 に答える 2

1

問題は、onClickListener が i を参照できないことです。解決策は、コンストラクターを onClickListener に追加し、そのコンストラクターに i の値を取得させ、それを onClickListener のメンバー変数に保存することです。もちろん、これほど多くのコードを読みやすくするために、匿名クラスではなく名前付きクラスにしたいと思うでしょう。

于 2013-07-15T13:18:51.923 に答える