【问题标题】:Back press fragments issue in androidandroid中的后按碎片问题
【发布时间】:2015-11-17 05:01:41
【问题描述】:

我有四个片段:A、B、C、D。现在我从 A --> B 移动,所以我的代码将是

A到B

getActivity().getSupportFragmentManager()
    .beginTransaction()
    .replace(R.id.content_frame, new B())
    .addToBackStack("A")
    .commit();

现在从 B 到 C 所以代码将是

getActivity().getSupportFragmentManager()
    .beginTransaction()
    .replace(R.id.content_frame, new C())
    .addToBackStack("B")
    .commit();

现在从 C 到 D。但我不想将 C 包含在 backstack 中,因为在后按时我不想显示 C 片段。

 getActivity().getSupportFragmentManager()
     .beginTransaction()
     .replace(R.id.content_frame, new D())
     .commit();

现在,当我按下返回按钮时,它将完美地工作到 A。现在,如果我再次重复相同的过程。现在再次按从 D 片段,我将直接发送到 A 片段而不是 B 片段。你能弄清楚我在上面的代码中犯的错误吗?

【问题讨论】:

  • @HareshChhelana 这不是问题显示没有调用添加到后台堆栈的问题。问题在于片段事务的工作方式。阅读此答案stackoverflow.com/questions/12529499/…
  • @Zach.. 其实我没有从那个链接得到
  • 是的,它没有定义明确的答案,只是概述了它的工作原理。我遇到过类似的麻烦,基本上必须定义我自己的 backstackchangelistener 来定义返回堆栈调用会发生什么

标签: android android-fragments fragmentmanager


【解决方案1】:

您必须为单个堆栈的 addToBackStack 提供相同的字符串值。

.replace(R.id.content_frame, new B())
.addToBackStack("stack") 

.replace(R.id.content_frame, new C())
.addToBackStack("stack") 

【讨论】:

    【解决方案2】:

    这是 BackStackChangedListener 的代码。

    public  static void performNoBackStackTransaction( final FragmentManager fragmentManager, String tag, Fragment fragment) {
        final int newBackStackLength = fragmentManager.getBackStackEntryCount() +1;
    
        fragmentManager.beginTransaction()
                .replace(R.id.content_frame, fragment, tag)
                .addToBackStack(tag)
                .commit();
    
        fragmentManager.addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
            @Override
            public void onBackStackChanged() {
                int nowCount = fragmentManager.getBackStackEntryCount();
                if (newBackStackLength != nowCount) {
                    // we don't really care if going back or forward. we already performed the logic here.
                    fragmentManager.removeOnBackStackChangedListener(this);
    
                    if ( newBackStackLength > nowCount ) { // user pressed back
                        fragmentManager.popBackStackImmediate();
                    }
                }
            }
        });
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-21
      相关资源
      最近更新 更多