2017-04-01 174 views
-1

我试图以一种非常简单的方式管理片段。我创建了一个实用工具类,它将碎片添加到后台堆栈中,当我们按下后退按钮时,前一个片段就出现了。我对此表示满意。但是,当我试图清除所有碎片,并显示根片段时,我无法正确地做到这一点。以下是我的工具类:如何管理堆栈中的碎片?

public class FragmentUtil { 
private FragmentUtil() { 
} 

public static void animatedReplace(FragmentActivity activity, int containerId, Fragment fragment, Bundle args, boolean addToBackStack){ 
    FragmentTransaction transaction=activity.getSupportFragmentManager().beginTransaction(); 
    fragment.setArguments(args); 
    if(addToBackStack){ 
     transaction.addToBackStack(fragment.getClass().getName()); 
    } 
    transaction.setCustomAnimations(R.anim.slide_from_right, R.anim.slide_to_left,R.anim.slide_from_left,R.anim.slide_to_right); 
    transaction.replace(containerId,fragment); 
    transaction.commit(); 
} 

public static void clearBackStackToHome(FragmentActivity activity){ 
    FragmentManager manager = activity.getSupportFragmentManager(); 
    manager.popBackStack(DashboardFragment.class.getName(),FragmentManager.POP_BACK_STACK_INCLUSIVE); 
} 
} 

当我想以另一个片段,我传递“真”为addToStack在animatedReplace方法。当我想清除后台时,我传递“false”并调用clearBackStackToHome方法。任何人都可以帮助我,我做错了什么?

回答

0

作出检查backStack是否为空的条件。当所有的碎片从堆栈中删除,然后显示您的根片段

0

试试这个:在你的实用工具类

public void clearBackStack() { 
    FragmentManager manager = activity.getSupportFragmentManager(); 
    if (manager.getBackStackEntryCount() > 0) { 
     FragmentManager.BackStackEntry first = manager 
       .getBackStackEntryAt(0); 
     manager.popBackStack(first.getId(), 
       FragmentManager.POP_BACK_STACK_INCLUSIVE); 
    } 
} 

确保在你的根/ animatedReplace()你通过boolean addToBackStack = false第一个片段。

以便它不会被清除。

编辑

要使用它OnBackPressed()您的活动覆盖onBackPressed()并添加以下代码:

@Override 
    public void onBackPressed() { 
     FragmentManager fm = getSupportFragmentManager(); 
     if (fm.getBackStackEntryCount() > 0) { 
      FragmentManager.BackStackEntry first = fm 
        .getBackStackEntryAt(0); 
      fm.popBackStack(first.getId(), 
        FragmentManager.POP_BACK_STACK_INCLUSIVE); 
      Log.i("MainActivity", "popping backstack"); 
     } else { 
      super.onBackPressed(); 
     } 
    } 
+0

嗨rafsanahmad007!该解决方案工作得很好。但是,如何在onBackPressed()上实现它? –

+0

@HiteshPamnani我编辑了答案.. – rafsanahmad007

+0

每当用户点击后退按钮时都会发生。我想在某个过程之后才会发生。例如,在完成付款过程后,用户可以点击返回按钮并导航到根片段。 –

0

是的,你可以管理片段回来按在onBackPressed()的方法你的MainActivity。 只是覆盖onBackPressed(),并检查backStack计数,如果计数为零,然后导航到您的根片段或从应用程序退出。此外,您可以根据检查后面堆栈中的哪个片段来实现代码。

@Override 
public void onBackPressed() { 


    FragmentManager fm = getSupportFragmentManager(); 
    int count = fm.getBackStackEntryCount(); 
    if (count >= 1) { 
     if (fm.findFragmentById(R.id.main_container) instanceof yourFragment) { 

      super.onBackPressed(); 

     } 
    } else { 
     // Show your root fragment here 
    } 

}