导航抽屉 - syncState()做什么以及为什么应该在onPostCreate()中调用它?

时间:2015-05-02 06:39:54

标签: java android android-layout android-activity navigation-drawer

我正在学习在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()内?谁能更好地解释一下呢?

4 个答案:

答案 0 :(得分:12)

  

syncState()

是什么

它将同步抽屉左手或右手滑动抽屉时旋转的抽屉图标,如果您尝试移除ERROR 1215 (HY000): Cannot add foreign key constraint同步将失败,从而导致错误旋转或甚至无法工作。

  

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

syncState()中调用它,以便在恢复onPostCreate时再次同步动画。关于Activity的好处是它在onPostCreate

之后立即被调用

编辑:

如@Vikram所述,您可以看到方法syncState

的内联文档

答案 1 :(得分:11)

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

首先,与ActionBarDrawerToggle.syncState()一样,正如文件所述,

  

将抽屉indicator/affordance的状态与...同步   已关联DrawerLayout

     

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

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

但是,派生类必须调用超类的这种方法的实现。如果他们不这样做,将抛出异常。

那么, syncState()到底做了什么?

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

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

好的,onPostcreate()在活动启动完成后调用onStart()onRestoreInstanceState(Bundle)后调用),而目前,Activity需要动画才能准备好工作。那么,如果它不是动画的最佳时刻,那么它是什么时候?

答案 2 :(得分:1)

您需要从活动的onPostCreate中调用syncState(),以根据活动已经处于打开或关闭状态时抽屉布局是否处于打开或关闭状态来设置指示器的状态(图标+抽屉本身)已使用onRestoreInstanceState恢复。

答案 3 :(得分:0)

简单地说:在onRestoreInstanceState发生后,SyncState()将同步切换状态。在onPostCreate(...)中调用它是因为在调用onPostCreate(...)之后调用了onRestoreInstanceState(...)