Android开发:启动Activity时动态显示指定Fragment及堆叠问题
问题解答
1. 如何在Activity创建时显示两个Fragment中的指定一个?
正确做法是通过Navigation组件动态设置导航图的起始目标,完全不需要手动添加Fragment。具体步骤如下:
- 获取NavHostFragment对应的NavController
- 加载导航图并根据条件修改其起始目标
- 将修改后的导航图重新设置给NavController
示例代码:
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.your_activity_layout) // 获取NavHostFragment和NavController val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment val navController = navHostFragment.navController // 加载导航图并修改起始目标 val navGraph = navController.navInflater.inflate(R.navigation.nav) // 替换成你的实际判断条件(比如从Intent获取参数、读取本地状态等) val shouldShowList = intent.getBooleanExtra("SHOW_LIST", false) navGraph.setStartDestination(if (shouldShowList) R.id.list_fragment else R.id.empty_fragment) // 应用修改后的导航图 navController.graph = navGraph }
这种方式下,Activity启动时会直接加载你指定的Fragment,且回退栈中只会有这个Fragment,按返回键直接退出Activity,符合你的需求。
2. 当前实现方式是否正确?
完全不正确。你的做法绕过了Navigation组件的管理逻辑:
- 手动调用
supportFragmentManager.add()添加Fragment,会导致Navigation无法追踪这个Fragment的生命周期和导航状态 - 后续如果涉及导航操作(比如从这两个Fragment跳转其他页面),会出现不可预期的问题
- 还会引发你遇到的堆叠显示问题
3. 两个Fragment堆叠显示的原因是什么?
原因有两点:
- NavHostFragment的自动加载:当你在布局中配置了
app:navGraph="@navigation/nav",NavHostFragment初始化时会自动加载导航图中startDestination指定的empty_fragment到容器中。 - 手动add操作的特性:你调用
supportFragmentManager.add()时,是将list_fragment添加到同一个容器里,而不是替换已有的Fragment。add操作会保留原有Fragment并将新Fragment叠在上方,所以两个Fragment会同时显示。
内容的提问来源于stack exchange,提问作者Benjamin Basmaci
相关产品推荐
相关产品推荐

