Java android setOnclickListener onClick方法非最终变量

Java android setOnclickListener onClick方法非最终变量,java,android,Java,Android,我是Android编程新手。 我想使用for循环来做类似的事情。 这是我的密码: int stubs[] = {R.id.stub_1, R.id.stub_2, R.id.stub_3}; View viewStubs[] = {stub_1, stub_2e, stub_3}; Button buttons[] = {button2, button3, button4}; button2 = (Button)findViewById(R.id.button2); button3 = (But

我是Android编程新手。
我想使用for循环来做类似的事情。
这是我的密码:

int stubs[] = {R.id.stub_1, R.id.stub_2, R.id.stub_3};
View viewStubs[] = {stub_1, stub_2e, stub_3};
Button buttons[] = {button2, button3, button4};
button2 = (Button)findViewById(R.id.button2);
button3 = (Button)findViewById(R.id.button3);
button4 = (Button)findViewById(R.id.button4);
for(int i=0; i<buttons.length; i++){
            buttons[i].setOnClickListener(new View.OnClickListener() {      
                public void onClick(View v) {
                    if(viewStubs[i] == null){
                        viewStubs[i] = ((ViewStub)findViewById(stubs[i])).inflate();
                    }

                }
            }
        }
int stubs[]={R.id.stub_1,R.id.stub_2,R.id.stub_3};
查看视图存根[]={stub_1,stub_2e,stub_3};
按钮按钮[]={button2,button3,button4};
button2=(按钮)findViewById(R.id.button2);
button3=(按钮)findViewById(R.id.button3);
button4=(按钮)findViewById(R.id.button4);

对于(int i=0;i尝试在
int i
之前添加
final

viewStubs
数组应该是
这个
类的属性(看起来它可能是静态的)

int stubs[]={R.id.stub_1,R.id.stub_2,R.id.stub_3};
//viewStubs应该是此类的属性(可能是静态的)
viewStubs[]={stub_1、stub_2、stub_3};
按钮[]={
(按钮)findViewById(R.id.button2),
(按钮)findViewById(R.id.button3),
(按钮)findViewById(R.id.button4)
};
对于(int i=0;i
for(int i=0;i
}


现在,您可以在内部for循环中使用最终变量inmutable_index而没有任何问题,只需将内部类中i变量的所有用法替换为inmutable_index变量。

检查以下问题:版本小于7的Java中没有闭包!您不能在内部类中使用局部var
i
。您应该重写代码你可以生成一个最终的int-var,并将i赋值给它。然后将新的var传递给内部类…我认为如果你想继续使用相同的代码,你必须全局赋值int-i。但这确实是一个便宜的主意。看,这可能对你有帮助,但这行不通。将final添加到for循环中的变量中意味着变量值无法更改和修改因此,它将开始抛出一些其他错误,如“无法分配最终局部变量”。想象一下在最终变量上循环,您就会明白为什么会出现问题。对于(final int i=0;iint stubs[] = {R.id.stub_1, R.id.stub_2, R.id.stub_3}; // viewStubs should be a property of this class (maybe static) viewStubs[] = {stub_1, stub_2, stub_3}; Button buttons[] = { (Button)findViewById(R.id.button2), (Button)findViewById(R.id.button3), (Button)findViewById(R.id.button4) }; for (int i=0; i<buttons.length; i++) { View.OnClickListener listener = new View.OnClickListener() { private int viewId; private int stubId; public void onClick(View v) { if (viewStubs[stubId] == null) { viewStubs[stubId] = (ViewStub)findViewById(viewId).inflate(); } } public View.OnClickListener setIds(int vid, int sid) { viewId = vid; stubId = sid; return this; } } buttons[i].setOnClickListener(listener.setIds(stubs[i], i)); }
 final int inmutable_index = i;

 btn.setOnClickListener(new OnClickListener(){...});