137

我的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);

}
4

6 回答 6

147

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

于 2015-04-24T17:15:29.140 回答
79

您可以将变量声明为 final,或将其设为实例(或全局)变量。如果您将其声明为最终版本,则以后将无法更改。

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

我在这里写了更深入的解释。它还解释了为什么不需要将实例变量和全局变量声明为 final。

于 2016-02-04T17:39:40.677 回答
50

The error says it all, change:

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

to

final ViewPager mPager = (ViewPager) findViewById(R.id.fieldspager);
于 2013-01-20T15:05:36.383 回答
34

这是一个有趣的答案。

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

我实际上不能为这个赢得荣誉。这是 IntelliJ 的推荐!感觉有点hacky。但似乎没有全局变量那么糟糕,所以我认为这里值得一提。这只是解决问题的一种方法。不一定是最好的。

final int[] tapCount = {0};

addSiteButton.setOnClickListener(new View.OnClickListener() {

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

});
于 2018-04-09T17:36:03.393 回答
6

正如@Veger 所说,您可以使final变量可以在内部类中使用。

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

我之所以调用它,pager而不是mPager因为您将它用作onCreate方法中的局部变量。前缀通常保留给类成员变量(即,在类开头声明的m变量,对所有类方法都可用)。

如果您确实需要一个类成员变量,那么将其设置为 final 是行不通的,因为您不能使用findViewById它来设置它的值,直到onCreate. 解决方案是不使用匿名内部类。这样mPager变量就不需要声明为 final 并且可以在整个类中使用。

public class MainActivity extends AppCompatActivity {

    private ViewPager mPager;
    private Button mButton;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        // ...

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

        // ...

        mButton.setOnClickListener(myButtonClickHandler);
    }


    View.OnClickListener myButtonClickHandler = new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            mPager.setCurrentItem(2, true);
        }
    };
}
于 2016-12-05T04:36:31.527 回答
1
    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();
    }
}
于 2020-04-28T06:15:24.503 回答