[英]Force close when back button pressed on fragment
我的Android應用程序有問題。 有一個Custome Adapter,我從那里調用一個片段,該片段具有mediaPlayer來播放音頻文件。 啟動片段后,音頻文件將播放。 如果用戶從ActionBar按后退按鈕,則不會發生任何問題,並切換到啟動該片段的先前片段。 但是,當用戶再次按返回按鈕時,將發生錯誤“ MyApp停止工作”。 我試圖通過Main Activity的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;
}
}
如果有人有解決方案,請提供幫助。 謝謝
編輯:下面是LOGCAT(最后幾行)
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)
這段代碼產生了空指針...
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override public void onClick(View v) {
getActivity().onBackPressed();
}
});
添加空指針保護
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override public void onClick(View v) {
Activity parent = getActivity();
if(parent != null)
parent.onBackPressed();
}
});
但是,您的代碼有點奇怪...
例如:您創建片段並為工具欄設置clickListener。 然后,您返回到上一個片段。.但是,您的工具欄仍在從被殺死的片段中引用偵聽器...
我認為最好的方法是處理家長活動中的工具欄...我不確定您是否可以..但我會改變這一點...
希望這會有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.