首页 文章

片段PopBackStack()问题

提问于
浏览
1

我有一个带有ListView导航抽屉的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;

此代码正常工作,直到我单击打开当前打开的片段 . 注意弹出backstack的代码,以便完成当前片段并打开相同类型的新片段 .

所以这里的问题是:我说点击片段A,然后点击片段B,然后再次点击片段B.在弹出Backstack以删除旧片段b并添加新片段b之间,片段A的onCreateView和onResume都运行 . 在创建片段B的新实例时,如何避免加载片段A?

谢谢!

---编辑---发布解决方案如下 . 这似乎有效 .

1 回答

  • 0

    我能够自己解决这个问题 . 这是为了防止其他人遇到同样的问题 .

    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) {}
    

相关问题