Android:片段backstack的问题

时间:2014-01-02 02:06:04

标签: android android-fragments

我创建了一个带有主/细节片段导航的视频应用。这个应用程序只有一个活动。

从列表片段中单击一个记录图标以导航到摄像机预览以录制视频。

让我说我的ListFragment是[1],我的相机预览片段是[2],我的细节片段是[3]。现在我的导航是[1] - [2] - [3]。

现在,当用户为3并按下后退按钮时,我相信应用程序正试图导航回[2]并且应用程序崩溃。我希望应用程序在用户按下后退按钮时始终导航回[1]。

我玩过addToBackStack的不同组合,似乎没有任何工作。如果可以,请帮忙!

所有这些代码都来自主要活动:

首次进入应用程序时(打开[1]):

VideoListFragment videoListFragment = new VideoListFragment();

            videoListFragment.setArguments(getIntent().getExtras());

            getFragmentManager().beginTransaction()
                    .add(R.id.container, videoListFragment)
                    .commit();

导航到[2]时:

CameraFragment cameraFragment = new CameraFragment();
        getFragmentManager().beginTransaction()
                .replace(R.id.container, cameraFragment)
                .commit();

导航到[3]时:

VideoDetailFragment videoDetailFragment = new VideoDetailFragment();
        Bundle args = new Bundle();
        args.putString(VideoDetailFragment.UUID, String.valueOf(uuid));
        videoDetailFragment.setArguments(args);
        getFragmentManager().beginTransaction()
                .replace(R.id.container, videoDetailFragment, "VideoDetailFragment")
                .addToBackStack(null)
                .commit();

更新 好的我在主要活动中使用此方法之前通过覆盖后退按钮来实现导航工作:

 @Override
    public void onBackPressed() {
        if (getFragmentManager().findFragmentByTag("VideoDetailFragment") != null) {
            // I'm viewing VideoDetailFragment
            getFragmentManager().beginTransaction()
                    .replace(R.id.container, new VideoListFragment())
                    .addToBackStack(null)
                    .commit();
        } else {
            super.onBackPressed();
        }
    }

但是现在当我按下后退按钮时我回到ListFragment中它什么也没做?我无法退出应用程序?

1 个答案:

答案 0 :(得分:0)

你说你尝试了不同的组合,但在我看来,你应该在导航到[2]而不是[3]时调用addToBackStack

响应您的更新 - 您可以通过选中

来自定义后退按钮
int depth = getFragmentManager().getBackStackEntryCount();
if (depth == 0)
    // exit app
else
    // switch fragments

编辑:注意到您直接使用FragmentManager而不是支持片段管理器