Navigation Drawer - syncState() 做啥以及为啥应该在 onPostCreate() 中调用它?

Posted

技术标签:

【中文标题】Navigation Drawer - syncState() 做啥以及为啥应该在 onPostCreate() 中调用它?【英文标题】:Navigation Drawer - what does syncState() do and why it should be called inside onPostCreate()?Navigation Drawer - syncState() 做什么以及为什么应该在 onPostCreate() 中调用它? 【发布时间】:2015-07-12 00:27:13 【问题描述】:

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

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

文档说:

将抽屉指示器/供能的状态与 链接 DrawerLayout。

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

我从 sstn 的回答 here 中进一步了解了 onPostCreate():OnPostCreate in Fragment

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

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

因为 onPostCreate() 没有正确记录并且不是真正的意图 用于应用程序 - 我可能想说这不是一个好主意 依赖于任何观察到的行为。

从这两个我无法理解任何事情。 syncState() 到底做了什么,为什么它应该在 onPostcreate() 里面?谁能更好地解释一下?

【问题讨论】:

它将同步抽屉中的图标和抽屉本身,当您移动抽屉时,图标旋转,尝试删除syncState,这些动画将不起作用。我的意思是越野车 @Rod_Algonquin ya...我刚注意到...当我评论此行时动画不起作用...但是,您能解释一下为什么应该在 onPostCreate() 中调用它吗? 正如我所说,即使活动已恢复,它也需要同步才能使动画正常工作,放在哪里?答案是onPostCreate,它在onRestoreInstanceState之后被调用 @Rod_Algonquin 我认为您应该将其发布为答案,先生,它的赏金-(扬起眉毛):) 【参考方案1】:

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

首先,至于ActionBarDrawerToggle.syncState(),正如文档所说,

将抽屉indicator/affordance的状态与 链接DrawerLayout

这应该从您的ActivityonPostCreate 方法中调用以 在DrawerLayout 的实例状态已被同步后 恢复,以及状态可能在这种情况下发生分歧的任何其他时间 没有通知ActionBarDrawerToggle 的一种方式。 (例如, 如果您停止转发适当的抽屉事件一段时间 时间。)

第二,对于Activity.onPostCreate(Bundle)在activity启动完成时调用(在onStart()onRestoreInstanceState(Bundle)被调用之后)。应用程序一般不会实现此方法;它旨在让系统类在应用程序代码运行后进行最终初始化。

但是,派生类必须调用到超类的实现这个方法。如果不这样做,就会抛出异常。

那么,syncState() 究竟做了什么?

好吧,ActionBarDrawerToggle.syncState() 将同步已更改图标的状态,这取决于 DrawerLayout 的操作。如果您曾经尝试删除syncState(),您会发现箭头图标不再旋转。

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

好吧,onPostcreate() 在 Activity 启动完成时被调用(在 onStart()onRestoreInstanceState(Bundle) 被调用之后),而此时,Activity 需要动画准备工作。那么,如果现在不是动画的最佳时刻,那是什么时候呢?

【讨论】:

【参考方案2】:

syncState() 是做什么的

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

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

onPostCreate 恢复时,它会在onPostCreate 中调用以重新同步动画。 onPostCreate 的好处是它在 onRestoreInstanceState 之后被调用

编辑:

正如@Vikram 所说,您可以查看方法syncState 的内联文档

【讨论】:

但是如果你从onResume() 打电话呢?在onRestoreInstanceState 之前调用或者它需要来自onRestoreInstanceState 的输入?? @Elltz onResumeonRestoreInstanceState 之后被调用 developer.android.com/reference/android/app/… @Elltz 除此之外,请阅读这里的方法评论:syncState() 这实际上总结了所有疑问,非常明确的答案谢谢@Vikram【参考方案3】:

您需要从 Activity 的 onPostCreate 调用 syncState() 以在使用 onRestoreInstanceState 恢复 Activity 后根据抽屉布局是处于打开还是关闭状态来设置指示器的状态(图标 + 抽屉本身)。

【讨论】:

【参考方案4】:

简单地说:SyncState()就是在onRestoreInstanceState发生后同步toggle状态。在onPostCreate(...) 中调用它是因为onPostCreate(...)onRestoreInstanceState(...) 被调用之后被调用。

【讨论】:

以上是关于Navigation Drawer - syncState() 做啥以及为啥应该在 onPostCreate() 中调用它?的主要内容,如果未能解决你的问题,请参考以下文章

android navigation drawer怎么用?

VueJs - Vuetify - v-navigation-drawer 与智能手机的迷你变体

v-navigation-drawer 在窗口调整大小时掉入失控循环

怎么自定义有navigation drawer效果的Android控件

VuetifyJS - 滚动 v-navigation-drawer

如何在 vuetify vue.js 应用程序中分隔 <v-navigation-drawer>?