Android开发:Fragment显示时如何避免短暂出现默认标题
问题原因
你使用的Jetpack导航组件默认会自动读取导航图中对应Fragment节点的label属性作为ActionBar标题,这个操作的执行时机早于Fragment的onCreateView生命周期,因此会先显示你导航图中默认配置的GameFragment标题,等onCreateView中你的自定义setTitle执行后才会替换,就出现了闪现的情况。
解决方法
下面提供3种可直接落地的方案:
方案1:提前标题设置时机(改动量最小)
把标题初始化逻辑提前到更早的生命周期执行,赶在视图渲染前完成标题设置:
- 将
randomizeQuestions()和setTitle()方法从onCreateView挪到Fragment的onCreate方法中:
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // 提前初始化题目数据,保证标题参数可用 randomizeQuestions() // 提前设置标题 setTitle() }
方案2:用导航组件原生动态标题功能(推荐)
导航组件本身支持带占位符的动态标题,不需要你自己写逻辑修改ActionBar,从根源避免闪现问题:
- 修改导航图中GameFragment的配置,添加参数和带占位符的label:
<fragment android:id="@+id/gameFragment" android:name="你的GameFragment全类名" android:label="Android Trivia ({currentIndex}/{totalQuestionCount})" > <argument android:name="currentIndex" app:argType="integer" android:defaultValue="1" /> <argument android:name="totalQuestionCount" app:argType="integer" /> </fragment>
- 导航到GameFragment的时候,把总题目数
numQuestions作为参数传入即可,导航组件会自动生成正确的标题,不需要再调用自定义的setTitle方法。
方案3:禁用导航组件自动设置标题功能
如果你不需要导航组件自动管理所有页面的标题,可以手动关闭这个功能:
- 不要调用
setupActionBarWithNavController方法,自己实现返回键逻辑即可完全避免自动改标题的行为:
// 主Activity中添加返回逻辑 override fun onSupportNavigateUp(): Boolean { val navController = findNavController(R.id.nav_host_fragment) return navController.navigateUp() || super.onSupportNavigateUp() }
- 所有页面的标题都由你自己手动控制,不会再出现默认的Fragment类名标题。
内容的提问来源于stack exchange,提问作者Polymath
相关产品推荐
相关产品推荐

