2016-07-08 3 views
0

私のAndroidアプリケーションに問題があります。オーディオファイルを再生するmediaPlayerを持つフラグメントを呼び出す場所からのCustomeアダプタがあります。フラグメントが開始されると、オーディオファイルが再生されます。ユーザーがActionBarから戻るボタンを押すと、問題は発生せず、このフラグメントが起動された場所から前のフラグメントに切り替えられます。しかし、ユーザーがもう一度戻るボタンを押すと、エラーは "MyAppの動作を停止"が発生します。メインアクティビティのonBackPressedメソッドでブレークポイントで問題をキャッチしようとしましたが、このメソッドを呼び出す前にエラーが発生しています。フラグメントのバックボタンを押したときに強制終了します

オーディオフラグメントを呼び出すカスタム・アダプタでマイコード:オーディオフラグメント持つメディアプレーヤーの

android.support.v4.app.FragmentTransaction fragmentTransaction; 
        FragmentManager fragmentManager = ((AppCompatActivity) context).getSupportFragmentManager(); 
        AudioFragment fragment = new AudioFragment(); 
        fragment.SoundTitle = currentAV.getFileText(); 
        fragment.oneTimeOnly = 0; 
        fragmentTransaction = fragmentManager.beginTransaction(); 
        fragmentTransaction.addToBackStack(null); 
        fragmentTransaction.replace(R.id.fragment_container, fragment); 
        fragmentTransaction.commit(); 

マイコード:誰もが解決策を持っている場合

public class AudioFragment extends Fragment { 

private Button btnForward, btnPause, btnPlay, btnBackward; 
private ImageButton btnStop; 
private ImageView iv; 
private MediaPlayer mediaPlayer; 
private double startTime = 0; 
private double finalTime = 0; 
private Handler myHandler; 
private int forwardTime = 90000; 
private int backwardTime = 90000; 
private SeekBar seekbar; 
private TextView tx1,tx2,tx3, txTitle; 

private boolean _isStopped = true; 
private int _length = 0; 

public static int oneTimeOnly = 0; 
public static String SoundTitle = ""; 

public AudioFragment() { 
    // Required empty public constructor 
} 


@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

    View view = inflater.inflate(R.layout.fragment_audio, container, false); 

    btnForward = (Button) view.findViewById(R.id.btnForward); 
    btnPause = (Button) view.findViewById(R.id.btnPause); 
    btnPlay = (Button)view.findViewById(R.id.btnPlay); 
    btnBackward = (Button)view.findViewById(R.id.btnBackward); 
    btnStop = (ImageButton)view.findViewById(R.id.btnStop); 
    iv=(ImageView)view.findViewById(R.id.imageView); 

    txTitle =(TextView)view.findViewById(R.id.textview); 
    txTitle.setText(SoundTitle); 
    tx1=(TextView)view.findViewById(R.id.textView2); 
    tx2=(TextView)view.findViewById(R.id.textView3); 
    tx3=(TextView)view.findViewById(R.id.textView4); 
    tx3.setText(""); 

    myHandler = new Handler(); 
    seekbar=(SeekBar)view.findViewById(R.id.seekBar); 

    ((AppCompatActivity)getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
    Toolbar toolbar = (Toolbar) getActivity().findViewById(R.id.toolbar); 
    ((AppCompatActivity)getActivity()).setSupportActionBar(toolbar); 

    toolbar.setNavigationIcon(R.drawable.abc_ic_ab_back_mtrl_am_alpha); 
    toolbar.setNavigationOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      getActivity().onBackPressed(); 
     } 
    }); 


    btnPlay.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Toast.makeText(getActivity(), "Playing sound",Toast.LENGTH_SHORT).show(); 
      PlaySound(); 
     } 
    }); 

    btnPause.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Toast.makeText(getActivity(), "Pausing sound",Toast.LENGTH_SHORT).show(); 
      mediaPlayer.pause(); 
      _length = mediaPlayer.getCurrentPosition(); 
      btnPause.setEnabled(false); 
      btnPlay.setEnabled(true); 
     } 
    }); 

    btnForward.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      int temp = (int)startTime; 

      if((temp+forwardTime)<=finalTime){ 
       startTime = startTime + forwardTime; 
       mediaPlayer.seekTo((int) startTime); 
       //Toast.makeText(getActivity(),"You have Jumped forward 5 seconds",Toast.LENGTH_SHORT).show(); 
      } 
      else{ 
       Toast.makeText(getActivity(),"Cannot jump forward 60 seconds",Toast.LENGTH_SHORT).show(); 
      } 
     } 
    }); 

    btnBackward.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      int temp = (int)startTime; 

      if((temp-backwardTime)>0){ 
       startTime = startTime - backwardTime; 
       mediaPlayer.seekTo((int) startTime); 
       //Toast.makeText(getActivity(),"You have Jumped backward 5 seconds",Toast.LENGTH_SHORT).show(); 
      } 
      else{ 
       Toast.makeText(getActivity(),"Cannot jump backward 60 seconds",Toast.LENGTH_SHORT).show(); 
      } 
     } 
    }); 

    btnStop.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      btnPause.setEnabled(false); 
      btnPlay.setEnabled(true); 
      _isStopped = true; 
      _length = 0; 
      mediaPlayer.stop(); 
      myHandler.removeCallbacks(UpdateSongTime); 
      mediaPlayer.release(); 
      mediaPlayer=null; 
     } 
    }); 

    PlaySound(); 
    return view; 
} 


private Runnable UpdateSongTime = new Runnable() { 
    public void run() { 
     startTime = mediaPlayer.getCurrentPosition(); 
     tx1.setText(String.format("%d min, %d sec", 

       TimeUnit.MILLISECONDS.toMinutes((long) startTime), 
       TimeUnit.MILLISECONDS.toSeconds((long) startTime) - 
         TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS. 
           toMinutes((long) startTime))) 
     ); 
     seekbar.setProgress((int)startTime); 
     myHandler.postDelayed(this, 100); 
    } 
}; 


private void PlaySound(){ 
    if(!_isStopped){ 
     mediaPlayer.seekTo(_length); 
     mediaPlayer.start(); 
     btnPause.setEnabled(true); 
     btnPlay.setEnabled(false); 
     return; 
    } 
    String sdpath = Environment.getExternalStorageDirectory().getAbsolutePath(); 
    String avPath = ""; 
    avPath = sdpath + Gen.AudioPath; 
    _isStopped = false; 
    mediaPlayer = MediaPlayer.create(getActivity(), Uri.parse(avPath)); 
    seekbar.setClickable(false); 
    btnPause.setEnabled(false); 

    mediaPlayer.start(); 
    finalTime = mediaPlayer.getDuration(); 
    startTime = mediaPlayer.getCurrentPosition(); 

    if (oneTimeOnly == 0) { 
     seekbar.setMax((int) finalTime); 
     oneTimeOnly = 1; 
    } 
    tx2.setText(String.format("%d min, %d sec", 
      TimeUnit.MILLISECONDS.toMinutes((long) finalTime), 
      TimeUnit.MILLISECONDS.toSeconds((long) finalTime) - 
        TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes((long) finalTime))) 
    ); 

    tx1.setText(String.format("%d min, %d sec", 
      TimeUnit.MILLISECONDS.toMinutes((long) startTime), 
      TimeUnit.MILLISECONDS.toSeconds((long) startTime) - 
        TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes((long) startTime))) 
    ); 

    seekbar.setProgress((int)startTime); 
    myHandler.postDelayed(UpdateSongTime,100); 
    btnPause.setEnabled(true); 
    btnPlay.setEnabled(false); 
    Gen.IsMediaPlayerRun = true; 
} 

}

を助けてください。おかげ

EDIT下記LOGCAT(LAST LINES)が

D/AndroidRuntime: Shutting down VM 
E/AndroidRuntime: FATAL EXCEPTION: main 
    Process: com.example.khan.abc, PID: 21144 
    java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v4.app.FragmentActivity.onBackPressed()' on a null object reference 
    at com.example.khan.abc.AudioFragment$1.onClick(AudioFragment.java:125) 
    at android.view.View.performClick(View.java:4848) 
    at android.view.View$PerformClick.run(View.java:20262) 
    at android.os.Handler.handleCallback(Handler.java:815) 
    at android.os.Handler.dispatchMessage(Handler.java:104) 
    at android.os.Looper.loop(Looper.java:194) 
    at android.app.ActivityThread.main(ActivityThread.java:5631) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:372) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:959) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:754) 
+0

logcatを共有してください... – W0rmH0le

+0

ありがとうございました。私は投稿を編集し、投稿の最後にlogcatの最後の行を共有しました。 – user1336491

答えて

1

このコードは、NULLポインタを生産している...

toolbar.setNavigationOnClickListener(new View.OnClickListener() { 
    @Override public void onClick(View v) { 
     getActivity().onBackPressed(); 
    } 
}); 

NULLポインタの保護を追加

toolbar.setNavigationOnClickListener(new View.OnClickListener() { 
    @Override public void onClick(View v) { 
     Activity parent = getActivity(); 
     if(parent != null) 
      parent.onBackPressed(); 
    } 
}); 

しかし、あなたのコードは少し奇妙です...

たとえば、フラグメントを作成してツールバーのclickListenerを設定します。しかし、あなたは以前の断片に戻ります..しかし、あなたのツールバーは、依然として殺された断片からリスナーを参照しています...

私は親の活動でツールバーを処理するのが最善だと思います...わかりませんあなたのために可能です...しかし、私はそれを変更するだろう...

希望これは助けることができます。

+0

私の問題を解決するためにギルヘムに感謝します。実際に私はアンドロイドに新しいです、これは私の最初のアプリケーションです。これがツールバーの奇妙なコードの理由です。このコードを改善することを提案したり、有用なリンクを指し示すことができれば、私は感謝します。ありがとう。 – user1336491

関連する問題