【问题标题】:Fragment PopBackStack() issues片段 PopBackStack() 问题
【发布时间】:2015-07-13 17:16:13
【问题描述】:

我有一个带有 ListView Navigation Drawer 的 Android 应用程序,它能够打开几个不同的片段。我遇到了一个问题,我允许用户单击以打开片段,即使它是当前显示的片段。 (这个功能是必须的)

如果单击列表项,这是我打开片段 B 的逻辑:

FragmentB fragmentB = FragmentB.newInstance();
transaction = ((AppCompatActivity) context).getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.container, fragmentB);

if (lastClicked == Constants.FRAGMENT_B) {
    ((AppCompatActivity) context).getSupportFragmentManager().popBackStack();
}

transaction.addToBackStack("FragmentB");

try {
    transaction.commit();
} catch (IllegalStateException e) {}

lastClicked = Constants.FRAGMENT_B;

在我单击打开当前打开的片段之前,此代码工作正常。请注意弹出回栈的代码,以便完成当前片段并打开相同类型的新片段。

所以这就是问题所在: 假设我单击片段 A,然后单击片段 B,然后再次单击片段 B。在弹出回栈以移除旧片段 b 并添加新片段 b 之间,片段 A 的 onCreateView 和 onResume 都运行。如何避免在创建片段 B 的新实例时加载片段 A?

谢谢!

---编辑--- 下面贴出解决方案。这似乎有效。

【问题讨论】:

    标签: android android-fragments


    【解决方案1】:

    我自己能弄明白。这是以防其他人遇到同样的问题。

    Fragment oldFragmentB = ((AppCompatActivity) context).getSupportFragmentManager().findFragmentByTag("FragmentB");
    FragmentB fragmentB = FragmentB.newInstance();
    transaction = ((AppCompatActivity)context).getSupportFragmentManager().beginTransaction();
    
    if (lastClicked == Constants.FRAGMENT_B && oldFragmentB != null) {
        transaction.remove(oldFragmentB);
        transaction.add(R.id.container, fragmentB, "FragmentB");
        transaction.disallowAddToBackStack();
    } else {
        transaction.replace(R.id.container, fragmentB, "FragmentB");
        transaction.addToBackStack("FeedFragment");
    }
    
    try {
        transaction.commit();
    } catch(IllegalStateException e) {}
    

    【讨论】:

      猜你喜欢
      • 2014-11-13
      • 2014-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-23
      • 1970-01-01
      • 2018-03-11
      相关资源
      最近更新 更多