ActionBarDrawerToggle的syncState应在onCreate还是onPostCreate调用?
这问题我当初刚接触导航抽屉的时候也纠结过,给你捋明白:
官方文档的建议为什么是onPostCreate?
Android官方文档推荐在onPostCreate()中调用syncState(),核心原因是**onPostCreate()是在onRestoreInstanceState()完成后才触发的**。当Activity因配置变更(比如屏幕旋转)或者被系统回收后重建时,onRestoreInstanceState()会恢复之前保存的DrawerLayout状态(比如抽屉是否处于打开状态)。这时候调用syncState(),能确保ActionBar/Toolbar上的汉堡图标(或返回箭头)和DrawerLayout的实际状态完全同步,不会出现“抽屉明明是打开的,图标却还是汉堡”这种状态不一致的尴尬情况。
那Android Studio 3.0模板在onCreate里调用是错的吗?
也不能说完全错——在简单场景下(比如不需要处理状态恢复的情况),onCreate()里调用也能正常工作。但它存在潜在风险:如果Activity需要恢复状态,onCreate()执行时onRestoreInstanceState()还没跑,这时候调用syncState(),同步的是初始状态而非恢复后的状态,就可能导致图标和抽屉实际状态不匹配。
有没有相关变更?
有的!后续AndroidX库推出后,官方对导航抽屉的最佳实践做了调整,同时Android Studio的模板也更新了:
- 新版模板已经把
syncState()的调用移到了onPostCreate()中,和官方文档建议一致; - 如果使用Jetpack Navigation组件,配合
AppBarConfiguration,甚至不需要手动调用syncState()——组件会自动处理图标和Drawer状态的同步,进一步简化了代码。
总结建议
如果你维护的是基于AS 3.0旧模板的老项目,最好把syncState()从onCreate()移到onPostCreate()里,避免状态不一致的问题;如果是新项目,直接用最新的Android Studio模板或者Jetpack Navigation组件,就不用再手动操心这个调用时机啦。
内容的提问来源于stack exchange,提问作者Florian Walther

