2017-02-22 5 views
0

ボタンを押したときにのみサウンド(音楽など)を再生するアプリケーションを作成しています。私はそれを持っているので、アンドロイドスタジオはこれ以外の問題を私に与えてくれない:私はmp.startを置く場所でエラーが発生する。 mp.stop; (mpは私のメディアプレイヤーです)、ボタンを押したときにアプリケーションのコードを伸ばしていなくても、止まっていなくても停止します。ここに私のコードは次のとおりです。変数が内部クラス内でアクセスされるMediaPlayerで宣言する必要があるOnTouchListener

public class MainActivity extends AppCompatActivity { 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     MediaPlayer mp = MediaPlayer.create(this, R.raw.music); 
     Button ImageButton = (Button) findViewById(R.id.button); 
     ImageButton.setOnTouchListener(new View.OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 

       switch(event.getAction()) { 
        case MotionEvent.ACTION_DOWN: 
         mp.start; 
         break; 
        case MotionEvent.ACTION_UP: 
         mp.stop; 
         break; 
       } 
       return false; 
      } 
     }); 
    } 
} 
+0

最終的な最終メディアとしてmpを作成します。MediaPlayer mp = MediaPlayer.create(this、R.raw.music); –

+0

なぜあなたはちょうど別の答えであなたが読んだことをコメントしてコピーしますか? –

答えて

1

溶液はタイトルに説明されている - 単にあなたがfinalを使用している変数を作ります。次の変更:

final MediaPlayer mp = MediaPlayer.create(this, R.raw.music); 

あなたは異なるスコープからMP変数を呼び出しています。

read about variable scope here - onTouchListener内のコードは、onCreate内のコードと同時に実行されません。したがって、mp finalをマークすると、onTouchListenerに「このオブジェクトへの参照を保持することは安全です。これ以上変更することはできないため、今後も正しいオブジェクトになります」

-1

このコードを試してください。 mpを最終的なものにします。

final MediaPlayer mp = MediaPlayer.create(this, R.raw.music); 

または、クラスのメンバー変数としてmpを作成します。

public class MainActivity extends AppCompatActivity { 
       MediaPlayer mp; 

      protected void onCreate(Bundle savedInstanceState) { 
       super.onCreate(savedInstanceState); 
       setContentView(R.layout.activity_main); 
       mp = MediaPlayer.create(this, R.raw.music); 
       Button ImageButton = (Button) findViewById(R.id.button); 
       ImageButton.setOnTouchListener(new View.OnTouchListener() { 
        @Override 
        public boolean onTouch(View v, MotionEvent event) { 

         switch (event.getAction()) { 
          case MotionEvent.ACTION_DOWN: 
           mp.start; 
           break; 
          case MotionEvent.ACTION_UP: 
           mp.stop; 
           break; 
         } 
         return false; 
        } 
       }); 
      } 
     } 
関連する問題