Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/201.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 简化多个旨在调用同一操作的OnClickListener_Java_Android_Iteration - Fatal编程技术网

Java 简化多个旨在调用同一操作的OnClickListener

Java 简化多个旨在调用同一操作的OnClickListener,java,android,iteration,Java,Android,Iteration,我有一个非常简单的问题,我对Java非常陌生,所以如果这是一件小事,我深表歉意 在我的应用程序中的一种情况下,选中一系列复选框中的每一个都会得到相同的点数。我可以为每个设置一个OnClickListener,但这似乎是一个不雅观的解决方案,因此我想编写一些代码,上面说,“选中这些复选框中的任何一个都会产生相同的结果。” 不幸的是,我写的东西不起作用: int[] ids = {R.id.cmCheckBox1, R.id.cmCheckBox2, R.id.cmCheckBox3, R.id.c

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

在我的应用程序中的一种情况下,选中一系列复选框中的每一个都会得到相同的点数。我可以为每个设置一个OnClickListener,但这似乎是一个不雅观的解决方案,因此我想编写一些代码,上面说,“选中这些复选框中的任何一个都会产生相同的结果。”

不幸的是,我写的东西不起作用:

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;
            }
        }
    });
}
将第3行转换为(final int i=0;i没有帮助,我想是因为final变量无法修改


非常感谢您的建议!

问题是您的onClickListener不能引用i。解决方案是向onClickListener添加一个构造函数,让该构造函数为i取值并将其保存到onClickListener的成员变量中。当然,有这么多代码,您可能希望将其设为named类,而不是为了可读性而使用的匿名类。

您正在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...
    }
}

非常感谢Gabe,我相信这是非常简单的东西,但是你能给我一个如何使用构造函数获取I值的例子吗?好的,我可以解决这个问题。有没有什么特别的原因说明为什么使用匿名类不是一个好主意?是因为它们可以从程序的其他部分引用,还是仅仅是可读性?最大的原因成本是代码的可维护性和可读性,是的。此外,在这种情况下,由于您需要为侦听器实现提供对复选框的引用,以便它能够知道是否选中了复选框,因此没有足够的灵活性。我添加了一个示例,因为您似乎正在努力从侦听器中引用复选框。
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...
    }
}