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 でなければなりません。そうしないと、その変数が内部クラスで変更され、後でその変数が外側のスコープで使用された場合、内側のクラスで行われた変更が外側のスコープで保持されないことに気付かずに、その変数を内側のクラスで使用できます。基本的に、内部クラスで起こったことは内部クラスにとどまります。

詳しい説明はこちらに書きました。また、インスタンス変数とグローバル変数を final として宣言する必要がない理由についても説明します。

于 2016-02-04T17:39:40.677 に答える
50

エラーはそれをすべて言います、変更してください:

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

final ViewPager mPager = (ViewPager) findViewById(R.id.fieldspager);
于 2013-01-20T15:05:36.383 に答える
6

@Vegerが言ったfinalように、変数を内部クラスで使用できるようにすることができます。

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

メソッドでローカル変数として使用しているからでpagerはなく、呼び出しました。接頭辞は通常、クラス メンバ変数 (つまり、クラスの先頭で宣言され、すべてのクラス メソッドで使用できる変数) 用に予約されています。mPageronCreatem

実際にクラス メンバー変数が必要な場合は、 を使用findViewByIdしてその値を設定することができないため、それを final にすることはできません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 に答える