假设我有一个以编程方式添加了片段的活动:
private void animateToFragment(Fragment newFragment, String tag) {
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.fragment_container, newFragment, tag);
ft.addToBackStack(null);
ft.commit();
}
返回到可见的上一个片段的最佳方法是什么?
我发现Trigger back-button functionality on button click in Android,但我在想模拟后退键事件不是正确的方法(我也无法让它工作):
dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK));
打电话给finish()
只关闭了我不感兴趣的活动。
有没有更好的方法来解决这个问题?
看看getFragmentManager().popBackStack()
方法(有几种可供选择)
http://developer.android.com/reference/android/app/FragmentManager.html#popBackStack()
要详细说明提供的其他答案,这是我的解决方案(放在一个活动中):
@Override
public void onBackPressed(){
FragmentManager fm = getFragmentManager();
if (fm.getBackStackEntryCount() > 0) {
Log.i("MainActivity", "popping backstack");
fm.popBackStack();
} else {
Log.i("MainActivity", "nothing on backstack, calling super");
super.onBackPressed();
}
}
当我们更新/添加片段时,
应该包括.addToBackStack()
。
getSupportFragmentManager().beginTransaction()
.add(detailFragment, "detail") // Add this transaction to the back stack (name is an optional name for this back stack state, or null).
.addToBackStack(null)
.commit();
之后如果我们给getFragments.popBackStackImmediate()
将返回true,如果我们添加/更新片段,然后返回到当前屏幕。
将这些行添加到onBackPressed()方法中。如果你在后台堆栈上有任何片段,popBackStackImmediate()方法会让你回到上一个片段
if(getFragmentManager().getBackStackEntryCount() > 0){
getFragmentManager().popBackStackImmediate();
}
else{
super.onBackPressed();
}
`
当您想要在主片段中按下后关闭应用程序时,此解决方案适用于基于底部栏的片段导航。
另一方面,当您打开我的代码中定义为“DetailedPizza”的辅助片段(片段中的片段)时,它将返回主片段的先前状态。干杯!
背面的内部活动把这个:
Fragment home = getSupportFragmentManager().findFragmentByTag("DetailedPizza");
if (home instanceof FragmentDetailedPizza && home.isVisible()) {
if (getFragmentManager().getBackStackEntryCount() != 0) {
getFragmentManager().popBackStack();
} else {
super.onBackPressed();
}
} else {
//Primary fragment
moveTaskToBack(true);
}
然后像这样启动另一个片段:
Fragment someFragment = new FragmentDetailedPizza();
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(R.id.container_body, someFragment, "DetailedPizza");
transaction.addToBackStack("DetailedPizza");
transaction.commit();
使用以下代码以编程方式返回上一个片段。
if ( getFragmentManager().getBackStackEntryCount() > 0)
{
getFragmentManager().popBackStack();
return;
}
super.onBackPressed();
要使该片段再次出现,只需将该片段添加到您想要返回的backstack,例如:
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Fragment fragment = new LoginFragment();
//replacing the fragment
if (fragment != null) {
FragmentTransaction ft = ((FragmentActivity)getContext()).getSupportFragmentManager().beginTransaction();
ft.replace(R.id.content_frame, fragment);
ft.addToBackStack("SignupFragment");
ft.commit();
}
}
});
在上面的例子中,当LoginFragment
被按下时,我打开Button button
,现在用户在SignupFragment
。因此,如果addToBackStack(TAG)
被调用,TAG = "SignupFragment"
,那么当在LoginFragment
按下后退按钮时,我们回到SignUpFragment
。
快乐的编码!
通过在最后一个片段上添加fragment_tran.addToBackStack(null)
,我能够回到最后一个片段。
添加新片段:
view.findViewById(R.id.changepass).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.container, new ChangePassword());
transaction.addToBackStack(null);
transaction.commit();
}
});
试试以下代码:
@Override
public void onBackPressed() {
Fragment myFragment = getSupportFragmentManager().findFragmentById(R.id.container);
if (myFragment != null && myFragment instanceof StepOneFragment) {
finish();
} else {
if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
getSupportFragmentManager().popBackStack();
} else {
super.onBackPressed();
}
}
}