Navigation Drawer - syncState() 是做什么的,为什么应该在 onPostCreate() 内部调用它?

我正在学习在Android中创建导航抽屉。在阅读本文时,我无法理解以下代码:

@Override
protected void onPostCreate(Bundle savedInstanceState) {
    super.onPostCreate(savedInstanceState);
    // Sync the toggle state after onRestoreInstanceState has occurred.
    mDrawerToggle.syncState();
}

文档说:

将抽屉指示器/提示的状态与链接的抽屉布局同步。

这应该从 Activity 的 onPostCreate 方法中调用,以便在 DrawerLayout 的实例状态恢复后进行同步,以及状态可能以未通知 ActionBarDrawerToggle 的方式发散的任何其他时间。(例如,如果您在一段时间内停止转发相应的抽屉事件。

此外,我从sstn的答案中读到这里OnPostCreate in FragmentonPostCreate()

onPostCreate() 主要用于框架使用(尽管您可以覆盖它)。文档说它是在onStart()和onRestoreInstanceState()之后调用的。

这可能会导致假设它可能在 onResume() 之前被调用,因此可能在消息循环调度事件(包括 AsyncTask 的 onPostExecute() 方法)之前被调用,这意味着您的 onPostExecute() 只会在 onPause() 之后触发。

由于onPostCreate()没有正确记录,也不是真正用于应用程序用途 - 我可能想说,依赖任何观察到的行为都不是一个好主意。

从这两个人中,我什么也听不懂。它到底做了什么,为什么它应该在里面?谁能更好地解释它?syncState()onPostcreate()


答案 1

好吧,我认为这个问题很好。我将收集这个问题及其答案。因此,让我们在这里做一些总结:

首先,关于,正如文件所说,ActionBarDrawerToggle.syncState()

将抽屉的状态与链接的 同步。indicator/affordanceDrawerLayout

这应该从 您的 方法调用,以便在 恢复 实例状态后进行同步,并且任何其他时间状态可能以未通知的方式发散。(例如,如果您在一段时间内停止转发相应的抽屉事件。ActivityonPostCreateDrawerLayoutActionBarDrawerToggle

其次,至于 ,它是在活动启动完成时调用的(在 onStart()onRestoreInstanceState(Bundle) 被调用之后)。应用程序通常不会实现此方法;它旨在让系统类在应用程序代码运行后进行最终初始化。Activity.onPostCreate(Bundle)

但是,派生类必须调用超类对此方法的实现。否则,将引发异常。

那么,syncState() 究竟是做什么的呢?

好吧,将同步已更改图标的状态,这与 的操作有关。如果您曾经尝试过删除 ,您将意识到箭头的图标将不再旋转。ActionBarDrawerToggle.syncState()DrawerLayoutsyncState()

为什么 syncState() 应该在 onPostcreate() 内部调用?

好吧,当活动启动完成时(在并且已经调用之后)调用,而此时,需要动画才能准备就绪。那么,如果这不是动画的最佳时刻,那么什么时候呢?onPostcreate()onStart()onRestoreInstanceState(Bundle)Activity


答案 2

syncState() 做什么

它将同步抽屉图标,当抽屉向左或向右滑动时旋转,如果您尝试删除同步将失败,从而导致错误的旋转,或者它甚至无法正常工作。syncState()

为什么它应该在onPostCreate()内部调用?

在 中调用它以在恢复时再次同步动画。好处是它紧随之后调用onPostCreateActivityonPostCreateonRestoreInstanceState

编辑:

如前所述@Vikram您可以看到方法 syncState 的内联文档


推荐