1

こんにちは、ここに私のコードがあります。私がやろうとしていたのは、画面のドローアブルが表示され始めた後、最初に 1 つの画像が背景 (touch2) に表示されることです。では、どこに問題があるのでしょうか?

問題は、画面に触れる前であり、戻るボタンを押すと touch2 画像が表示されると、ログ cat に強制終了エラーが表示され、 null ポインターのためにアクティビティを破棄できないというエラーが表示されます。これが私のコードです

RelativeLayout psirenlayout;
MediaPlayer mp;
private boolean played;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //full screeen
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
        WindowManager.LayoutParams.FLAG_FULLSCREEN);
    //full screen
    setContentView(R.layout.constrc);
    //brightness full
    WindowManager.LayoutParams lp = getWindow().getAttributes();
    lp.screenBrightness = 100 / 100.0f;
    //brightness full
    psirenlayout = (RelativeLayout) findViewById(R.id.psirenlayout);
    this.psirenlayout.setBackgroundResource(R.drawable.touch2);
    played=false;



  psirenlayout.setOnTouchListener(new OnTouchListener() {


@SuppressWarnings("deprecation")
@Override
public boolean onTouch(View v, MotionEvent event) {
    int DELAY = 80;
    if (!played){
        playSound();
        played=true;
        }
          if(event.getAction() == MotionEvent.ACTION_UP) {    
    final RelativeLayout psirenlayout = ((RelativeLayout)  findViewById(R.id.psirenlayout));
    ColorDrawable f = new ColorDrawable(0xffff0000);
    ColorDrawable f2 = new ColorDrawable(0xffff7f00);
    ColorDrawable f3 = new ColorDrawable(0xffffff00);
    ColorDrawable f4 = new ColorDrawable(0xff00ff00);
    ColorDrawable f5 = new ColorDrawable(0xff00ffff);
    ColorDrawable f6 = new ColorDrawable(0xff0000ff);
    ColorDrawable f7 = new ColorDrawable(0xff8b00ff);
    ColorDrawable f8 = new ColorDrawable(0xffff0000);
    ColorDrawable f9 = new ColorDrawable(0xffff7f00);
    ColorDrawable f10 = new ColorDrawable(0xffffff00);
    ColorDrawable f11 = new ColorDrawable(0xff00ffff);
    ColorDrawable f12 = new ColorDrawable(0xff0000ff);
    ColorDrawable f13 = new ColorDrawable(0xff8b00ff);




    AnimationDrawable a = new AnimationDrawable();

    a.addFrame(f, DELAY);
    a.addFrame(f2, DELAY);
    a.addFrame(f3, DELAY);
    a.addFrame(f4, DELAY);
    a.addFrame(f5, DELAY);
    a.addFrame(f6, DELAY);
    a.addFrame(f7, DELAY);
    a.addFrame(f8, DELAY);
    a.addFrame(f9, DELAY);
    a.addFrame(f10, DELAY);
    a.addFrame(f11, DELAY);
    a.addFrame(f12, DELAY);
    a.addFrame(f13, DELAY);


    a.setOneShot(false);

    psirenlayout.setBackgroundDrawable(a); //  is deprecated  API 16
     //psirenlayout.setBackground(a); //  API 16
    a.start();
            }
        return true;
    }
  });
}
  private void playSound(){
      mp = MediaPlayer.create(disco.this, R.raw.disco);
  mp.setOnCompletionListener(new OnCompletionListener() {

      @Override
      public void onCompletion(MediaPlayer mp) {

          mp.release();
      }
  }); 
  mp.setLooping(true);
  mp.start();
 }

  @Override
    public boolean onKeyDown(int keyCode, KeyEvent event)
    {
        if ((keyCode == KeyEvent.KEYCODE_BACK))
        {   
            mp.stop();
            finish();
        }
        return super.onKeyDown(keyCode, event);
    }

    @Override
   protected void onPause() {
  super.onDestroy();

    }
    @Override
       protected void onDestroy() {
        mp.stop();
      super.onDestroy();


       }
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.mymenu, menu);
    return true;
}

}

私は破壊の停止ですべてを試しました! プログラムを強制終了した後、常にこのエラーが発生します。終了すると、mainActivity に戻りますが、これは奇妙です。

25 15:29:49.543: E/AndroidRuntime(11154): 致命的な例外: メイン 05-25 15:29:49.543: E/AndroidRuntime(11154): java.lang.NullPointerException 05-25 15:29:49.543: E/ AndroidRuntime(11154): com.soheil.prolight.disco.onKeyDown(disco.java:120) 05-25 15:29:49.543: E/AndroidRuntime(11154): android.view.KeyEvent.dispatch(KeyEvent.java で:2609) 05-25 15:29:49.543: E/AndroidRuntime(11154): android.app.Activity.dispatchKeyEvent(Activity.java:2375) 05-25 15:29:49.543: E/AndroidRuntime(11154): com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1847) 05-25 15:29:49.543: E/AndroidRuntime(11154): android.view.ViewRootImpl.deliverKeyEventPostIme(ViewRootImpl. java:3701) 05-25 15:29:49.543: E/AndroidRuntime(11154): android.view.ViewRootImpl.handleImeFinishedEvent(ViewRootImpl.java:3651) 05-25 15:29:49.543: E/AndroidRuntime(11154): android.view.ViewRootImpl$ViewRootHandler.handleMessage(ViewRootImpl.java:2818) 05-25 15:29:49.543: E/AndroidRuntime(11154) : android.os.Handler.dispatchMessage(Handler.java:99) 05-25 15:29:49.543: E/AndroidRuntime(11154): android.os.Looper.loop(Looper.java:137) 05-25 15:29:49.543: E/AndroidRuntime(11154): android.app.ActivityThread.main(ActivityThread.java:5041) 05-25 15:29:49.543: E/AndroidRuntime(11154): java.lang.reflect で.Method.invokeNative(ネイティブ メソッド) 05-25 15:29:49.543: E/AndroidRuntime(11154): java.lang.reflect.Method.invoke(Method.java:511) 05-25 15:29:49.543: E/AndroidRuntime(11154): com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 05-25 15:29:49.543: E/AndroidRuntime(11154): com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)

4

2 に答える 2

4

メソッドにif(mp != null) { }アラウンドmp.stop();を入れます。onDestroy()まだ初期化されていないときに、MediaPlayer を停止しようとする可能性があります。

onDestroy() メソッドは次のようになります。

@Override
protected void onDestroy() {
    if(mp != null) {
        mp.stop();
    }
    super.onDestroy();
}
于 2013-05-25T18:46:04.140 に答える
0

onPause 内から onDestroy を呼び出すのは正しくありません...
- onCreate は基本コンポーネントをセットアップします
- onDestroy はクリーンアップを行います
- アクションとアプリケーション関連のフローを開始または停止する場合は、onResume と onPause に依存することをお勧めします

    @Override
   protected void onPause() {
        if (mp!=null) { mp.stop(); }

    }
    @Override
       protected void onDestroy() {
      super.onDestroy();
       }
于 2013-05-25T19:12:43.327 に答える