我有一个布局,我一直在交换我的两个碎片 MainFragment和SecondFragment 我有一个活动级别按钮,其onclick我在布局中交换这些片段。
但是每次从FragB切换回来时我都需要保留相同的FragA实例。 下面是我使用的代码但应用程序崩溃时出现NullPointerError。
// When journey button menu is clicked [INSIDE THE MAIN ACTIVITY]
OnClickListener journeyBtnClick = new OnClickListener() {
@Override
public void onClick(View arg0) {
if(currentType==0){
InitThisFragment(1);
}else{
InitThisFragment(0);
}
}
};
private int currentType=0;
public void InitThisFragment(int type){
if(type==0){
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
//get the previously added MainFragment from the BackStack
Fragment mainFragment= getSupportFragmentManager().findFragmentByTag("main");
transaction.replace(R.id.abs_fragment_container,mainFragment);
transaction.setTransition(FragmentTransaction.TRANSIT_ENTER_MASK);
transaction.commit();
}else{
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.abs_fragment_container, new SecondFragment());
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
transaction.commit();
}
currentType=type;
}
在此之前,我在Activity类的OnCreate()中初始化MainFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.abs_fragment_container, new MainFragment());
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); //add MainFragment in the BackStack
transaction.addToBackStack("main");
transaction.commit();
}
我是用户点击按钮
请帮忙! 提前谢谢。
答案 0 :(得分:0)
如果我已经理解你想做什么,如果你在secondFragment中,你可以调用“FragmentManager.popBackStack()”。
所以:
public void InitThisFragment(int type){
if(type==0){
getFragmentManager().popBackStack();
}else{
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.abs_fragment_container, new SecondFragment());
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
transaction.commit();
}
currentType=type;
}
答案 1 :(得分:0)
将“main”标记放在替换方法中。
transaction.replace(R.id.abs_fragment_container, new MainFragment(),"main");
对于addToBackStack和replace方法,tag参数的工作方式不同。根据android for tag参数:
addToBackStack:此后备堆栈状态的可选名称,或null。
replace:片段的可选标记名称,以便稍后使用FragmentManager.findFragmentByTag(String).
检索片段