簡體   English   中英

在片段上按下后退按鈕時強制關閉

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM