变量在内部类中访问。需要宣布最终

时间:2013-01-20 15:04:33

标签: java android

所以标题说明了一切。我的onClick内部出现了编译错误。

这是代码。

public class fieldsActivity extends Activity {

Button addSiteButton;
Button cancelButton;
Button signInButton;


/**
 * Called when the activity is first created.
 */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // to create a custom title bar for activity window
    requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);

    setContentView(R.layout.fields);
    // use custom layout title bar
    getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.topbar);

    Pager adapter = new Pager();
    ViewPager mPager = (ViewPager) findViewById(R.id.fieldspager);
    mPager.setAdapter(adapter);
    mPager.setCurrentItem(1);



    addSiteButton = (Button) findViewById(R.id.addSiteButton);
    addSiteButton.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
           mPager.setCurrentItem(2, true); //Compilation error happens here.
        }


    });


    cancelButton = (Button) findViewById(R.id.cancel_button);
    signInButton = (Button) findViewById(R.id.sign_in_button);

}

6 个答案:

答案 0 :(得分:116)

如果你不想让它成为最终的,你总是可以把它变成一个全局变量。

答案 1 :(得分:50)

您可以声明变量final,或使其成为实例(或全局)变量。如果你宣布它是最终的,你将无法在以后更改它。

方法中定义并由匿名内部类访问的任何变量都必须是final。否则,您可以在内部类中使用该变量,而不会意识到如果变量在内部类中更改,然后稍后在封闭范围中使用它,则内部类中所做的更改不会在封闭范围中保留。基本上,内部类中发生的事情会停留在内部类中。

我写了更多in-depth explanation here。它还解释了为什么不需要将实例和全局变量声明为final。

答案 2 :(得分:39)

错误说明了一切,改变:

ViewPager mPager = (ViewPager) findViewById(R.id.fieldspager);

final ViewPager mPager = (ViewPager) findViewById(R.id.fieldspager);

答案 3 :(得分:12)

这是一个有趣的答案。

您可以声明最终的单元素数组,并显然更改所需的数组元素。我确定它首先打破了这个编译器规则实现的原因,但是当你像今天一样处于时间限制时它会很方便。

我实际上无法为此申请信用。这是IntelliJ的推荐!感觉有点hacky。但并不像全局变量那么糟糕,所以我认为值得一提。它只是该问题的一种解决方案。不一定是最好的。

final int[] tapCount = {0};

addSiteButton.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) {
       tapCount[0]++;
    }

});

答案 4 :(得分:0)

当您创建non static nestedinner classAbout时,编译器实际上会生成一个新类-<ClassName>$<Counter>.class,并将下一个参数传递给构造函数Local variable on stack < / p>

  1. 对外部类的引用
  2. 内部使用的最终局部变量

不可能从构造函数(或方法)中重新分配变量,但是更改传递变量的状态很简单。这就是为什么您可以使用:

  1. 外部类的领域
  2. 最终局部变量,它是引用类型(例如Object ...),并在内部类中更改其状态
  3. 包装为值(原始)类型(例如int ...)的局部变量,并将其作为引用类型传递(IntelliJ IDEA建议您转换一个变量放入最后一个元素数组

答案 5 :(得分:0)

    public class ConfigureActivity extends Activity {

        EditText etOne;
        EditText etTwo;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_configure);

            Button btnConfigure = findViewById(R.id.btnConfigure1);   
            btnConfigure.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            configure();
                        }
                    });
    }

    public  void configure(){
            String one = etOne.getText().toString();
            String two = etTwo.getText().toString();
    }
}