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

Kru*_*hah 25 java android android-layout android-activity navigation-drawer

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

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

文件说:

将抽屉指示符/示能表的状态与链接的DrawerLayout同步.

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

而且我读到onPostCreate()从sstn的答案在这里:OnPostCreate在片段

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

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

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

从这两个我无法理解.究竟做syncState()了什么以及为什么它应该在里面onPostcreate()?谁能更好地解释一下?

Rod*_*uin 12

syncState()是什么

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

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

它被调用以在恢复onPostCreate时再次同步动画Activity.好消息onPostCreate是它之后被称为onRestoreInstanceState

编辑:

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


Sil*_*ght 12

好吧,我认为这个问题很好.我将收集这个问题及其答案.那么,我们在这里做一些总结:

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

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

这应该从你ActivityonPostCreate方法调用,在DrawerLayout实例状态恢复后同步,以及状态可能ActionBarDrawerToggle以未通知的方式分散的任何其他时间.(例如,如果您停止转发适当的抽屉事件一段时间.)

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

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

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

好吧,ActionBarDrawerToggle.syncState()将同步已更改的图标的状态,这会对动作产生影响DrawerLayout.如果你试图删除它syncState(),你会发现箭头的图标不再旋转.

为什么syncState()要内部调用onPostcreate()

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