2016-05-30 75 views
0

我想问一些关于BackStackFragments的内容。让我们假设我们在应用程序中有2个按钮。当他们每个人点击时,一个新的片段开始并显示在屏幕上。连接到父级活动和后退按钮的片段

if (buttonIndex == 0) { 
    FragmentTransaction ft = fragmentManager.beginTransaction(); 
    ft.replace(android.R.id.content,new FirstFragment()); 
    ft.addToBackStack("added first"); 
    ft.commit(); 
} else if (buttonIndex == 1) { 
    FragmentTransaction ft1 = fragmentManager.beginTransaction(); 
    ft1.replace(android.R.id.content,new SecondFragment()); 
    ft1.setTransition(ft1.TRANSIT_FRAGMENT_OPEN); 
    ft1.addToBackStack("added second"); 
    ft1.commit(); 
} 

现在你看到发生了什么。但这里是我的问题。 我点击第一个和第二个按钮,这两个片段都被添加到 堆栈中。没问题:)。但是如果我点击第二个按钮3次, 那么相应的片段也会运行3次。意思是 我必须点击后退按钮3次才能回到第一个片段。

这是应该发生?

Regards, Theo。

+0

。其实并没有硬性规定。如果用户想要返回的前一个片段中的数据,即每个后续片段与前一个片段相关,则应堆叠它们,否则如果它们不相关则不堆叠它们。 –

+1

使用'fragmentManager.popBackStack(null,FragmentManager.POP_BACK_STACK_INCLUSIVE); ' –

+0

@ BOUTERBIAT Qualid。我刚刚尝试过。该片段仍然运行3次,但不是进入前一个片段,而是返回主活动屏幕。 – Theo

回答

2

你可以add a tag while add/replace的一个片段。那么你应该检查一次是否添加了相同的片段。如果是,则删除现有的。

FragmentTransaction ft = fragmentManager.beginTransaction(); 
Fragment prev = getFragmentManager().findFragmentByTag("FirstFragment"); 
if (prev != null) { 
    ft.remove(prev); 
} 
ft.replace(android.R.id.content,new FirstFragment(),"FirstFragment"); 
ft.addToBackStack("added first"); 
ft.commit(); 

一个good example如果您不希望新的实例每次被堆叠单击该按钮,然后不创建新实例,并添加到堆栈中如下所示的DialogFragment实施

+0

谢谢你花一些时间回答,但我仍然有同样的问题:( – Theo

+0

你有没有为第二个片段添加相同的功能? –

+0

Yeap。我也为第二个片段做了完全相同的事情。 – Theo