我有一个片段,例如A - > B - > C.当我在片段C中时,按下后退按钮我需要获得片段A.也就是说,片段B不需要添加到backStack。这是实现片段之间转换的代码。
FragmentManager fragmentManager = this.getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
Fragment fragment = fragmentManager.findFragmentByTag(tag);
fragment.getArguments().putAll(args);
transaction.replace(idContainer, fragment, tag);
transaction.addToBackStack(null);
transaction.commit();
在片段C的开头,我不使用 transaction.addToBackStack(null);
现在我有以下问题。从片段С中我单击后退按钮并输入片段A,但是两层片段相互叠加。
答案 0 :(得分:1)
从A到B的过渡
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new BFragment(), "BFragment").addToBackStack("A_TO_B").commit();
从B过渡到C
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new CFragment(), "CFragment").addToBackStack("B_TO_C").commit();
覆盖Activity的onBackPressed()方法。
@Override
public void onBackPressed();
if (getSupportFragmentManager().findFragmentByTag("CFragment") != null) {
getSupportFragmentManager().popBackStack("A_TO_B",
FragmentManager.POP_BACK_STACK_INCLUSIVE);
} else {
super.onBackPressed();
}
}
答案 1 :(得分:0)
你可以在Fragment_C中使用以下代码在fragment_C上的Back back按钮上返回Fragment_A
@Override
public void onResume() {
super.onResume();
getView().setFocusableInTouchMode(true);
getView().requestFocus();
getView().setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK){
Fragment_A fragment = null;
fragment = new Fragment_A();
FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.container_body, fragment);
fragmentTransaction.commit();
return true;
}
return false;
}
});
}
答案 2 :(得分:-1)
当您致电Transaction.addToBackStack(null)
时,您的Fragment
已添加到了Backstack,因此当您不想将您的片段添加到Backstack时,您就不应该致电。
你应该做什么
当您使用Fragment-A
替换Fragment-B
时,不应该致电Transaction.addToBackStack(null)
,但是当您使用Fragment-B
替换Fragment-C
时,您应该致电{{1} }}。
执行此操作时,您的Transaction.addToBackStack(null)
和Fragment-A
会被备份,Fragment-C
则不会,现在当您按下后退按钮时,您将Fragment-B
。