OnBackPressed时Fragment回退栈未生效,APP直接关闭问题求助
解决Fragment回退栈优先于APP关闭的问题
嘿,我明白你现在的困扰——你重写了UserActivity的onBackPressed()方法,但现在的逻辑直接跳过了Fragment回退栈的处理,导致一按返回键就直接关闭APP,完全没机会先回退Fragment对吧?
问题根源
你当前的onBackPressed()方法里,只要抽屉没打开,就直接触发跳转到MainActivity关闭APP的逻辑,完全没有检查Fragment回退栈中是否还有未回退的Fragment,这就导致Fragment的addToBackStack逻辑根本没机会执行。
修复方案
修改UserActivity的onBackPressed()方法,先判断Fragment回退栈是否有内容,优先处理Fragment回退,只有当回退栈为空时,再执行关闭APP的操作:
@Override public void onBackPressed() { DrawerLayout drawerLayout = findViewById(R.id.drawerLayout); if (drawerLayout.isDrawerOpen(GravityCompat.START)) { drawerLayout.closeDrawer(GravityCompat.START); } else { // 先检查Fragment回退栈是否有条目 FragmentManager fragmentManager = getSupportFragmentManager(); if (fragmentManager.getBackStackEntryCount() > 0) { // 回退上一个Fragment fragmentManager.popBackStack(); } else { // 回退栈为空时,再执行关闭APP的逻辑 Intent intent = new Intent(UserActivity.this, MainActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); intent.putExtra("EXIT", true); startActivity(intent); } } }
额外注意点
另外看你添加Fragment的代码,switch的default分支会让fragment为null,执行事务的时候可能会抛出空指针异常,建议加个判断和分支处理:
@Override public boolean onNavigationItemSelected(@NonNull MenuItem item) { Fragment fragment = null; switch (item.getItemId()) { case R.id.setting: fragment = new SettingFragment(); break; case R.id.logOut: SharedPreference.setLoggedIn(this,null,false); Intent intent = new Intent(UserActivity.this,MainActivity.class); startActivity(intent); // 这里直接return,避免后续执行Fragment事务 drawerLayout.closeDrawer(GravityCompat.START); return true; // 可以设置一个默认的Fragment,比如用户主页Fragment default: fragment = new UserHomeFragment(); } // 只有fragment不为null时才执行事务 if (fragment != null) { FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); fragmentTransaction.replace(R.id.userFragment,fragment).addToBackStack(null).commit(); } drawerLayout.closeDrawer(GravityCompat.START); return true; }
这样修改后,当你在Fragment页面按返回键时,会先依次回退所有添加到回退栈的Fragment,直到回退栈为空,才会触发关闭APP的操作,完美符合你的预期~
内容的提问来源于stack exchange,提问作者Hrishi
相关产品推荐
相关产品推荐

