Навигационный ящик – что делает syncState () и почему его следует вызывать внутри onPostCreate ()?

Я изучаю создание навигационного ящика в Android. Читая это , я не могу понять следующий код:

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

В документации говорится:

Синхронизируйте состояние индикатора ящика с помощью связанного DrawerLayout.

Это следует вызывать из метода onPostCreate вашей Activity для синхронизации после восстановления состояния экземпляра DrawerLayout и в любое другое время, когда состояние может расходиться таким образом, что ActionBarDrawerToggle не был уведомлен. (Например, если вы прекратите переадресацию соответствующих событий ящика в течение определенного периода времени.)

Далее я прочитал о onPostCreate() из ответа sstn здесь : OnPostCreate in Fragment

OnPostCreate () в основном предназначен для использования в каркасе (хотя вы можете переопределить его). Документы говорят, что он вызывается после onStart () и onRestoreInstanceState ().

Это может привести к предположению, что он может быть вызван до onResume () и, вероятно, до того, как цикл сообщений отправит события (в том числе метод OnPostExecute () AsyncTask), что означает, что onPostExecute () будет запускаться только после onPause ().

Поскольку onPostCreate () неправильно документирован и не предназначен для использования приложениями, я могу сказать, что не стоит полагаться на какое-либо наблюдаемое поведение.

Из этих двух я ничего не мог понять. Что именно делает syncState() и почему оно должно быть внутри onPostcreate() ? Может ли кто-нибудь объяснить это лучше?

Solutions Collecting From Web of "Навигационный ящик – что делает syncState () и почему его следует вызывать внутри onPostCreate ()?"

Ну, я считаю этот вопрос хорошим. И я соберу этот вопрос и его ответы. Итак, давайте сделаем несколько резюме здесь:

Во-первых , что касается ActionBarDrawerToggle.syncState() , как и в документе,

Синхронизируйте состояние indicator/affordance ящика с помощью связанного DrawerLayout .

Это следует вызывать из метода onPostCreate вашей Activity для синхронизации после восстановления DrawerLayout экземпляра DrawerLayout и в любое другое время, когда состояние может расходиться таким образом, что ActionBarDrawerToggle не был уведомлен. (Например, если вы прекратите переадресацию соответствующих событий ящика в течение определенного периода времени.)

Во-вторых , что касается Activity.onPostCreate(Bundle) , он вызывается, когда запуск активности завершен (после onStart() и onRestoreInstanceState(Bundle) ). Приложения обычно не реализуют этот метод; Он предназначен для того, чтобы системные классы выполняли окончательную инициализацию после запуска кода приложения.

Но это производные классы должны обратиться к реализации этого класса суперкласса. Если они этого не сделают, будет выбрано исключение.

Итак, что делает syncState() точно?

Итак, ActionBarDrawerToggle.syncState() синхронизирует состояние измененного значка, которое делит на действия DrawerLayout . Если вы попытались удалить syncState() , вы поймете, что значок стрелки больше не вращается.

И почему syncState() следует вызывать внутри onPostcreate() ?

Ну, onPostcreate() вызывается, когда запуск активности завершен (после того, как были onStart() и onRestoreInstanceState(Bundle) ), в то время как на данный момент Activity необходимо, чтобы анимации были готовы к работе. Итак, если это не лучший момент для анимации, когда это?

Что делает syncState ()

Он будет синхронизировать значок ящика, который вращается, когда ящик вытащен жестом влево или вправо, и если вы попытаетесь удалить syncState() синхронизация завершится неудачно, что приведет к неправильному вращению или даже не будет работать.

Почему его следует называть внутри onPostCreate ()?

Он вызывается в onPostCreate для синхронизации анимации снова и снова при восстановлении Activity . Хорошая вещь о onPostCreate заключается в том, что она называется сразу после onRestoreInstanceState

Редактировать:

Как указано в @Vikram, вы можете увидеть встроенную документацию метода syncState

Вам нужно вызвать syncState() из syncState() вашей активности, чтобы установить состояние индикатора (значок + сам ящик) в зависимости от того, находится ли макет ящика в открытом или закрытом состоянии после того, как активность была восстановлена ​​с помощью onRestoreInstanceState .

Просто скажите: SyncState () – синхронизировать состояние переключения после возникновения события onRestoreInstanceState. И вызвать его в onPostCreate(...) из-за того, что onPostCreate(...) вызывается сразу после onRestoreInstanceState(...) .