【问题标题】:Android: Problems with fragment backstackAndroid:片段回栈的问题
【发布时间】:2014-01-19 10:49:46
【问题描述】:

我创建了一个带有主/细节片段导航的视频应用。此应用只有一个 Activity。

从列表片段中,您单击录制图标以导航到相机预览以录制视频。

假设我的 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 中,当我按下后退按钮时它什么也不做?我无法退出应用程序?

【问题讨论】:

    标签: android android-fragments


    【解决方案1】:

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

    响应您的更新 - 您可以通过检查自定义后退按钮

    int depth = getFragmentManager().getBackStackEntryCount();
    if (depth == 0)
        // exit app
    else
        // switch fragments
    

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

    【讨论】:

    • 谢谢 Grennis,但是当我这样做时,[1] 和 [3] 会同时显示吗?我同时在屏幕上看到了两个片段,但我不知道为什么?
    • 打开 [1] 时尝试调用 replace() 而不是 add(),我发现它的行为有所不同
    • 恐怕还在做。并且 [1] 仅在活动 onCreate 方法中被调用,因此它永远不会真正再次被调用(它是一个承载许多片段的单个活动)。
    • 好吧,当我回到 ListFragment 时,不幸的是 getBackStackEntryCount() 不为 0。事实上,每次我按下后退按钮时这个数字都会增加?
    • 您需要自己在“切换片段”部分调用 pop() 将其清除
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-12
    • 2012-09-13
    相关资源
    最近更新 更多