Jetpack Navigation组件回退栈异常,按系统返回键直接退出应用如何解决?
问题原因
- 布局文件中
FragmentContainerView缺少app:defaultNavHost="true"属性,该属性用于声明当前导航宿主为默认宿主,接管系统返回键的回退栈处理逻辑,未添加时系统返回键会直接触发Activity的销毁逻辑,不会处理Navigation的回退栈。 - 可选补充:MainActivity未重写导航向上返回方法,后续如需顶部导航栏的返回按钮生效也需要补充对应逻辑。
解决方案
1. 修改activity_main.xml
在FragmentContainerView节点中添加app:defaultNavHost="true"属性,修改后代码如下:
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <androidx.fragment.app.FragmentContainerView android:id="@+id/nave_host_fragment" android:name="androidx.navigation.fragment.NavHostFragment" android:layout_width="match_parent" android:layout_height="match_parent" app:navGraph="@navigation/nav_graph" app:defaultNavHost="true" /> </androidx.constraintlayout.widget.ConstraintLayout>
2. 补充MainActivity的导航逻辑(可选,用于支持顶部返回按钮)
修改MainActivity.kt代码如下:
package com.callsamik.jetpacknavigationcomponentdemo import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import androidx.navigation.fragment.NavHostFragment class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) } override fun onSupportNavigateUp(): Boolean { val navHostFragment = supportFragmentManager.findFragmentById(R.id.nave_host_fragment) as NavHostFragment return navHostFragment.navController.navigateUp() || super.onSupportNavigateUp() } }
修改完成后重新编译运行,点击返回键就会按照Navigation的回退栈逻辑先回到HomeFragment,在HomeFragment页点击返回键才会退出应用。
内容的提问来源于stack exchange,提问作者Samik Bandyopadhyay
相关产品推荐
相关产品推荐

