0

我有一个非常简单的问题,我对 Java 很陌生,如果这是一件小事,我深表歉意。

在我的应用程序中的一种情况下,检查一系列复选框中的每一个都会获得相同数量的分数。我可以为每个设置一个 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 回答
0

您正在 for 循环中创建匿名类,这并不是您真正想要做的。

创建您自己的实现 OnClickListener 的类,然后将其作为侦听器附加到您的所有复选框。

编辑:因为您似乎遇到了一些麻烦,所以这里是朝着正确方向轻推 -

checkBoxes[i].setOnClickListener(new MyOnClickListener(checkBoxes[i]));

...

class MyOnClickListener
    implements OnClickListener
{
    private CheckBox checkBox;
    public MyOnClickListener( CheckBox box )
    {
        // maintain a reference to the CheckBox so we can see if it's checked!
        this.checkBox = box; 
    }

    public void onClick(View v)
    {
        // if this.checkBox is checked, then...
    }
}
于 2013-07-15T13:27:18.107 回答