0

私は、起動時にメディア プレーヤーの一時停止ボタンを無効にする Android アプリを作成しています。[OK] ボタンをクリックした後 (音楽の再生が開始された後)、一時停止ボタンを有効にしたいと考えています。

このコードは、最後の行を除いて正常に動作します (関係のない行をいくつか削除しました)。これにより、実行時エラー (NullPointerException) が発生します。

MainActivity.this を使用してボタンにアクセスしました。私は何を間違っていますか?

助けてくれてありがとう!

public class MainActivity extends Activity {

    // initialise variables
    TextView textOut;
    MediaPlayer mediaPlayer;
    Button buttonPauze;
    Button ok;

    // *******************************************************
    // set Layout - on create
    // *******************************************************
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textOut = (TextView) findViewById(R.id.textView1);


        // *******************************************************
        // set the play, generate and pauze buttons
        // *******************************************************
        Button buttonPauze = (Button) findViewById(R.id.buttonPauze);
        Button ok = (Button) findViewById(R.id.buttonStart);

        buttonPauze.setOnClickListener(buttonPauseOnClickListener);
    buttonPauze.setEnabled(false);
    ok.setEnabled(true);

    // *******************************************************
    // on click generate
    // *******************************************************
    ok.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            MainActivity.this.buttonPauze.setEnabled(true);
4

5 に答える 5

2

交換:

Button buttonPauze = (Button) findViewById(R.id.buttonPauze);

と:

buttonPauze = (Button) findViewById(R.id.buttonPauze);

基本的にbuttonPauze、1 つはローカル変数として、もう 1 つはクラス フィールドとして 2 つありました。を削除することでButton、クラス フィールドをbuttonPauzeローカルで使用し、それに適切なオブジェクトを割り当てます。


と同じことok

于 2012-09-17T13:45:45.883 に答える
2

NPE は、ボタン参照をローカル変数に割り当ててから、onCreate()初期化されていないグローバル変数にアクセスしようとするためです。これを置き換えます:

Button buttonPauze = (Button) findViewById(R.id.buttonPauze);

これとともに

buttonPauze = (Button) findViewById(R.id.buttonPauze);

このような間違いを避けるために、一般的な慣行を適用し、クラスのグローバル変数にプレフィックスを付けることができます。

Button mButton;

MainActivity.this.構文を使用しないでください。同じクラスの変数にアクセスしているので意味がありません。ただ

buttonPauze.setEnabled(true);

十分です(ところで:それは「一時停止」です)。

于 2012-09-17T13:48:04.950 に答える
0

ラインで

Button buttonPauze = (Button) findViewById(R.id.buttonPauze);

インスタンス変数ではなく、ローカル変数を定義して割り当てています。したがって、行でインスタンス変数を参照すると

MainActivity.this.buttonPauze.setEnabled(true);

buttonPauzeは設定されておらず、まだnullです。修正するには、単に変更します

buttonPauze = (Button) findViewById(R.id.buttonPauze);
于 2012-09-17T13:46:05.647 に答える
0

グローバル変数と同じ名前のローカル変数を作成しているため、問題が発生します。

// ローカル変数を作成しない

  buttonPauze = (Button) findViewById(R.id.buttonPauze);
  ok = (Button) findViewById(R.id.buttonStart);
于 2012-09-17T13:48:29.327 に答える
0

buttonPause を 2 回定義しないでください。

于 2013-09-14T17:32:43.250 に答える