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
。这应该从您的
Activity
的onPostCreate
方法中调用以 在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 onResume
在 onRestoreInstanceState
之后被调用 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() 中调用它?的主要内容,如果未能解决你的问题,请参考以下文章
VueJs - Vuetify - v-navigation-drawer 与智能手机的迷你变体
v-navigation-drawer 在窗口调整大小时掉入失控循环
怎么自定义有navigation drawer效果的Android控件