Java 如何让6个按钮在Android中使用不同的参数调用相同的方法?

Java 如何让6个按钮在Android中使用不同的参数调用相同的方法?,java,android,view,onclick,onclicklistener,Java,Android,View,Onclick,Onclicklistener,无论是通过编程方式还是在xml文件中设置onClick方法,我都不知道如何通过它传递额外的参数。在以下代码中: for (int i = 0; i < 6; i++) { rollView[i].setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { changeKeepR

无论是通过编程方式还是在xml文件中设置
onClick
方法,我都不知道如何通过它传递额外的参数。在以下代码中:

    for (int i = 0; i < 6; i++) {
        rollView[i].setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                changeKeepRoll(i);
            }
        });
    }
for(int i=0;i<6;i++){
rollView[i].setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图){
changeKeepRoll(i);
}
});
}
我正在为6个不同的
TextView
s设置
onClickListener
,我想调用方法
changeKeepRoll
,该方法将整数参数作为输入,但是我得到错误“变量“I”是从内部类中访问的,需要声明为final”。这意味着什么?我如何纠正它?

for(int I=0;I<6;I++){
  for (int i = 0; i < 6; i++) {
        final int temp = i;
        rollView[i].setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View view) {
            changeKeepRoll(temp);
        }
    });
  }
最终内部温度=i; rollView[i].setOnClickListener(新的OnClickListener(){ @凌驾 公共void onClick(视图){ 换基尔(临时); } }); }
用于(int i=0;i<6;i++){
最终内部温度=i;
rollView[i].setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图){
换基尔(临时);
}
});
}

实现OnClickListener类并使用不同的参数集重载该方法

public class myClass implements View.OnClickListener {
int changeKeepRoll;
    @Override
    public void onClick(View v) {

    }

    public void onClick(int i) {

    }
}

将changeKeepoll变量置于方法范围之外或使其成为最终变量。

实现OnClickListener类并使用不同的参数集重载方法

public class myClass implements View.OnClickListener {
int changeKeepRoll;
    @Override
    public void onClick(View v) {

    }

    public void onClick(int i) {

    }
}

将changeKeepoll变量置于方法范围之外或将其设为最终变量。

您可以通过实现以下接口将参数传递给
OnClickListener

class MyOnClickListener implements OnClickListener {

    private int i;

    public MyOnClickListener(int i) {
        this.i = i;
    } 

    public void onClick(View view) {
        changeKeepRoll(i);
    }
}
并且,您的
for
循环将如下所示:

for(int i = 0; i < rollView.length; i ++) {
    rollView[i].setOnClickListener(new MyOnClickListener(i));
}
for(int i=0;i
这是以前提出的问题:

希望这有帮助,
Bala

您可以通过实现以下接口将参数传递给
OnClickListener

class MyOnClickListener implements OnClickListener {

    private int i;

    public MyOnClickListener(int i) {
        this.i = i;
    } 

    public void onClick(View view) {
        changeKeepRoll(i);
    }
}
并且,您的
for
循环将如下所示:

for(int i = 0; i < rollView.length; i ++) {
    rollView[i].setOnClickListener(new MyOnClickListener(i));
}
for(int i=0;i
这是以前提出的问题:

希望这有帮助,
Bala

Java有一条规则,如果您使用匿名内部类来实例化对象,则内部使用的任何变量都必须在该块内声明,或者如果您希望使用块外的变量,则该对象必须是最终的或有效的最终(Java 8)Java有一条规则,如果你使用匿名内部类来实例化一个对象,内部使用的任何变量都必须在该块内声明,或者如果你想使用块外的变量,该对象必须是最终的或有效的最终(Java 8)@Thomas Doyle这个答案是最好的实践。。。我的答案是欺骗编译器,我只是想帮助您不要对代码做太多更改;)@Kushan我认为你低估了自己-这不是黑客行为,也不是在愚弄编译器。它们是循环变量的闭包工作方式(匿名的东西必须在变量上关闭),这是一个真正的修复。Net也有同样的要求——它与实现或编译器无关,而是与闭包本身的哲学“形而上学”有关。(当然,编译器可以自动完成这项工作,但很恶心)。@Thomas Doyle这是最佳实践。。。我的答案是欺骗编译器,我只是想帮助您不要对代码做太多更改;)@Kushan我认为你低估了自己-这不是黑客行为,也不是在愚弄编译器。它们是循环变量的闭包工作方式(匿名的东西必须在变量上关闭),这是一个真正的修复。Net也有同样的要求——它与实现或编译器无关,而是与闭包本身的哲学“形而上学”有关。(当然,编译器可以自动实现这一点,但很恶心)。