繁体   English   中英

我想引用在不同方法中定义的内部类中的非final变量

[英]I want to refer to a non-final variable inside an inner class defined in a different method

我正在编写一个Android应用程序,其中我有几个按钮布局在网格中。 我想设置每个按钮的onClick方法,所以我写了这个:

for (int i = 0; i < button.length; i++) {
    for (int j = 0; j < button[0].length; j++) {
        button[i][j].setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                press(i, j);
            }
        });
    }
}

其中press(int i, int j)在其他地方实现。 我得到错误,“不能引用在不同方法中定义的内部类中的非最终变量i”。

所以,现在我只需写出每个函数,如下所示:

button[0][0].setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        press(0, 0);
    }
});

button[0][1].setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        press(0, 1);
    }
});

// more like this...

这有效,但看起来很傻。 有没有更好的办法?

是的,试试这个:

for (int i = 0; i < button.length; i++) {
    for (int j = 0; j < button[0].length; j++) {
        final int listenerI = i;
        final int listenerJ = j;
        button[i][j].setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                press(listenerI, listenerJ);
            }
        });
    }
}

您可以定义一个帮助方法来设置按钮的侦听器:

private static void setListenerForButton(Button button, final int i, final int j) {
    button.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            press(i, j);
        }
    });
}    

然后你可以像这样使用它

for (int i = 0; i < button.length; i++) {
    for (int j = 0; j < button[0].length; j++) {
        setListenerForButton(button[i][j], i, j);
    }
}

这是一个更通用的解决方案的特例:定义额外的final int变量以在内部类中使用,并使用ij的值初始化它们。 在这种情况下,额外的final int变量是辅助函数的参数。

for (int i = 0; i < button.length; i++) {
    for (int j = 0; j < button[0].length; j++) {

        final int localI = i;
        final int localJ = j;

        button[localI][localJ].setOnClickListener(...);
    }
}

ij声明为外部类中的全局变量

你可以和一个听众一起过去:

package tayek.so9551773;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.*;
import android.util.Log;
public class So9551773 extends Activity {
    void press(int i,int j) {
        Log.d("so",i+","+j+" was clicked");
        System.out.println(i+","+j+" was clicked");
    }
    void addButtons(TableLayout tableLayout) {
        for(int i=0;i<buttons.length;i++) {
            TableRow tableRow=new TableRow(this);
            tableLayout.addView(tableRow);
            for(int j=0;j<buttons[i].length;j++) {
                buttons[i][j]=new Button(this);
                tableRow.addView(buttons[i][j]);
                buttons[i][j].setText(i+" "+j);
                buttons[i][j].setId(i*buttons.length+j);
                buttons[i][j].setOnClickListener(onClickListener);
            }
        }
    }
    @Override public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d("so","created");
        TableLayout tableLayout=new TableLayout(this);
        addButtons(tableLayout);
        setContentView(tableLayout);
    }
    Button[][] buttons=new Button[3][3];
    OnClickListener onClickListener=new OnClickListener(){
        public void onClick(View v) {
            int id=v.getId();
            press(id/buttons.length,id%buttons.length);
        }
    };
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM