Java - 不能引用非final变量

时间:2013-10-26 11:55:15

标签: java

Android新手。 我应该编辑什么来摆脱一个奇怪的“不能引用在另一个方法中定义的内部类中的非最终变量按钮?

@Override
    public void onCreate(Bundle SavedInstanceState) {
        super.onCreate(SavedInstanceState);
        setContentView(R.layout.activity_main);
        Button button1 = (Button)findViewById(R.id.button1);
        Button button2 = (Button)findViewById(R.id.button2);
        //Listeneři
        button1.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                button1.setText("ok");

6 个答案:

答案 0 :(得分:3)

改变这个..

 final Button button1 = (Button)findViewById(R.id.button2);
    //Listeneři
    button1.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            button1.setText("ok");

您可以将按钮变量引用声明为global ..

答案 1 :(得分:2)

你正在做的事情是不可能的。

JLS # chapter 8

  

使用但未在内部类中声明的任何局部变量,形式参数或异常参数必须声明为final。

     

在内部类的主体之前,必须明确赋值(§16)使用但未在内部类中声明的任何局部变量。

final中使用该变量之前将其变为innerclass,以便您可以获得使用它的权限。

final Button button1 = (Button)findViewById(R.id.button2);

同样聪明,也要留下final,如果你在听众中使用它们的话......

答案 2 :(得分:0)

您需要将按钮变量设置为“final”,如下所示

final Button button1 = (Button)findViewById(R.id.button1);
final Button button2 = (Button)findViewById(R.id.button2);

因此,无法重新初始化button1和button2。

答案 3 :(得分:0)

试试这个......

 @Override
 public void onCreate(Bundle SavedInstanceState) {
    super.onCreate(SavedInstanceState);
    setContentView(R.layout.activity_main);
    Button button1 = (Button)findViewById(R.id.button1);
    Button button2 = (Button)findViewById(R.id.button2);
    //Listeneři
    button1.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            Button button = (Button)v;
            button.setText("ok");
        }
    }

不需要将变量作为最终变量......

答案 4 :(得分:0)

您使用的是Eclipse吗?如果是这样,使用快速修复菜单将帮助您解决诸如非最终变量和缺少导入语句之类的问题。

http://help.eclipse.org/juno/index.jsp?topic=%2Forg.eclipse.jdt.doc.user%2Fconcepts%2Fconcept-quickfix-assist.htm

在Windows上,将光标置于错误上,然后按Ctrl + 1打开快速修复菜单。按Enter键(通常)可以令人满意地解决错误。

答案 5 :(得分:0)

你有两种解决问题的方法, 改变               Button button1 = (Button)findViewById(R.id.button1);

final Button button1 = (Button)findViewById(R.id.button1);

2.将button1定义为函数。就像这样:

public class MainActivity extends Activity
{
    Button button1 = (Button)findViewById(R.id.button1);
    Button button2 = (Button)findViewById(R.id.button2);
@Override
public void onCreate(Bundle SavedInstanceState) {
    super.onCreate(SavedInstanceState);
    setContentView(R.layout.activity_main);

    //Listeneři
    button1.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            button1.setText("ok");