假设我有一个以编程方式添加片段的活动:
private void animateToFragment(Fragment newFragment, String tag) {
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.fragment_container, newFragment, tag);
ft.addToBackStack(null);
ft.commit();
}
返回前一个可见片段的最佳方法是什么?
我发现Android中按钮点击的触发后退按钮功能,但我认为模拟后退键事件不是正确的方法(我也不能让它工作):
dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK));
调用finish()只是关闭我不感兴趣的活动。
还有更好的办法吗?
当你想关闭应用程序时,当你在主片段中向后按下时,这个解决方案非常适合基于底部栏的片段导航。
另一方面,当你打开二级片段(片段中的片段),在我的代码中定义为“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();
要使该片段再次出现,只需将该片段添加到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,现在用户在SignupFragment中。因此,如果调用addToBackStack(TAG),其中TAG = "SignupFragment",那么当在LoginFragment中按下返回按钮时,我们将返回到SignupFragment。
编码快乐!
我来到这里寻找或相同的想法,同时我提出了自己的,我相信不是那么糟糕,如果与ViewPager工作。
所以我所做的,是在持有viewPager的父活动中重写onBackPressed方法,并设置它总是回到负1的位置,直到它到达第一个片段,然后关闭活动。
@Override
public void onBackPressed() {
if(viewPager.getCurrentItem()>0){
viewPager.setCurrentItem(viewPager.getCurrentItem()-1);
} else {
super.onBackPressed();
this.close();
}
}
private void close(){
this.finish();
}
这可能会有一个下降,就像它每次只回到左边的一个方向,所以它可能不会工作得很好,如果有制表符,你切换位置与片段跳过,(从0到2,然后按回会把你放在1,而不是0)
对于我的情况,2个片段在viewPager没有标签,它的工作很好。
遵循Kotlin代码对我有用
1. 在简单活动类中添加了多个片段
override fun onBackPressed() {
if (supportFragmentManager.backStackEntryCount > 0) {
Log.i(TAG, "=============onBackPressed - Popping backstack====")
supportFragmentManager.popBackStack()
} else {
Log.i(TAG, "=============onBackPressed called because nothing on backstack====")
super.onBackPressed()
}
}
2. 在使用了多个片段的BottomNavigationView Activity类中添加
override fun onBackPressed() {
Log.e(TAG, "=============onBackPressed")
val navController = findNavController(R.id.nav_host_fragment)
when (navController.currentDestination!!.id) {
R.id.navigation_comments, R.id.navigation_my_posts -> {
menuItemPosition = 0
navController.navigate(R.id.navigation_home)
Log.i(TAG, "=============onBackPressed - Popping backstack with First fragment ====")
}
else -> {
Log.i(TAG, "=============onBackPressed called because nothing on backstack====")
super.onBackPressed()
}
}
}