Androidでナビゲーションドロワーを作成する方法を学んでいます。 this を読んでいると、次のコードがわかりません。
_@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
// Sync the toggle state after onRestoreInstanceState has occurred.
mDrawerToggle.syncState();
}
_
ドキュメントには次のように書かれています。
ドロワーインジケーター/アフォーダンスの状態をリンクされたDrawerLayoutと同期します。
これは、アクティビティのonPostCreateメソッドから呼び出して、DrawerLayoutのインスタンス状態が復元された後、およびActionBarDrawerToggleに通知されないように状態が分岐した可能性があるときに同期する必要があります。 (たとえば、適切なドロワーイベントの転送を一定期間停止した場合。)
さらに、sstnの回答からonPostCreate()
について読みました ここ : OnPostCreate in Fragment
onPostCreate()は、主にフレームワークでの使用を目的としています(ただし、オーバーライドすることはできます)。ドキュメントによると、onStart()およびonRestoreInstanceState()の後に呼び出されます。
これは、onResume()の前に、したがっておそらくメッセージループがイベント(AsyncTaskのonPostExecute()メソッドを含む)をディスパッチする前に呼び出される可能性があるという仮定につながる可能性があります。つまり、onPostExecute()はonPause()の後にのみ起動します。
OnPostCreate()は適切に文書化されておらず、実際にはアプリケーションでの使用を目的としていないため、観察された動作に依存することはお勧めできません。
この2つからは何も理解できませんでした。 syncState()
は正確に何をし、なぜそれがonPostcreate()
の中にあるべきなのですか?誰かがそれをよりよく説明できますか?
そうですね、この質問は良い質問だと思います。そして、私はこの質問とその答えを集めます。それで、ここでいくつかの要約をしましょう:
First、ActionBarDrawerToggle.syncState()
に関しては、ドキュメントに記載されているとおり、
ドロワーの状態_
indicator/affordance
_をリンクされたDrawerLayout
と同期します。これは、
Activity
のonPostCreate
メソッドから呼び出して、DrawerLayout
のインスタンス状態が復元された後、および状態が次のように分岐した可能性がある場合に同期する必要があります。ActionBarDrawerToggle
は通知されませんでした。 (たとえば、適切なドロワーイベントの転送を一定期間停止した場合。)
Second、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
アクティビティのonPostCreateからsyncState()
を呼び出して、アクティビティがonRestoreInstanceState
。
簡単に言うと、SyncState()は、onRestoreInstanceStateが発生した後にトグル状態を同期することです。そして、それをonPostCreate(...)
で呼び出すのは、onPostCreate(...)
が呼び出された直後にonRestoreInstanceState(...)
が呼び出されるためです。