Java不能引用非final变量

lac*_*cas 1 java variables

for (int i=0; i<pages; i++) {
        ImageView img=new ImageView(this);
             ...

        img.setOnClickListener(new OnClickListener() {
            @Override public void onClick(View v) {
                showpage(i);
                }


            }
        });

        FLall.addView(img);
    }
Run Code Online (Sandbox Code Playgroud)

我怎么能在java中这样做?我总是"不能在不同方法中定义的内部类中引用非最终变量i"

Mar*_*iot 9

虽然你可以创建一个垃圾变量并标记它,final但实际上我更喜欢通过构造函数传递这个值.它有点简洁,但是如果你决定在某个时候移动你的匿名内部类,那么它可以更加可维护.

for (int i=0; i<pages; i++) {
    ImageView img=new ImageView(this);
    ...

    img.setOnClickListener(new OnClickListener(i) {
        private int ind;
        public OnClickListener(int ind){
            super();
            this.ind = ind;
        }
        @Override 
        public void onClick(View v) {
            showpage(ind);
        }
    });

    FLall.addView(img);
}
Run Code Online (Sandbox Code Playgroud)


bma*_*ies 8

setOnClickListener通话前:

final int thisIndex = i;
Run Code Online (Sandbox Code Playgroud)

然后thisIndex在处理程序中引用.