web-dev-qa-db-ja.com

ナビゲーションドロワー-syncState()は何をし、なぜonPostCreate()内で呼び出す必要があるのですか?

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()の中にあるべきなのですか?誰かがそれをよりよく説明できますか?

26
Krupal Shah

そうですね、この質問は良い質問だと思います。そして、私はこの質問とその答えを集めます。それで、ここでいくつかの要約をしましょう:

FirstActionBarDrawerToggle.syncState()に関しては、ドキュメントに記載されているとおり、

ドロワーの状態_indicator/affordance_をリンクされたDrawerLayoutと同期します。

これは、ActivityonPostCreateメソッドから呼び出して、DrawerLayoutのインスタンス状態が復元された後、および状態が次のように分岐した可能性がある場合に同期する必要があります。 ActionBarDrawerToggleは通知されませんでした。 (たとえば、適切なドロワーイベントの転送を一定期間停止した場合。)

SecondActivity.onPostCreate(Bundle)に関しては、アクティビティの起動が完了したときに呼び出されます(onStart()およびonRestoreInstanceState(Bundle)の後)アプリケーションは通常、このメソッドを実装しません。これは、アプリケーションコードの実行後にシステムクラスが最終的な初期化を行うことを目的としています。

ただし、派生クラスは、このメソッドのスーパークラスの実装を呼び出す必要があります。そうでない場合、例外がスローされます。

したがって、syncState()は正確に何をしますか?

さて、ActionBarDrawerToggle.syncState()は、変更されたアイコンの状態を同期します。これは、DrawerLayoutのアクションに依存します。 syncState()を削除しようとすると、矢印のアイコンが回転しなくなることがわかります。

そしてなぜsyncState()onPostcreate()内で呼び出す必要があるのですか?

さて、onPostcreate()は、アクティビティの起動が完了したときに呼び出されます(onStart()onRestoreInstanceState(Bundle)が呼び出された後)が、現時点ではActivity動作する準備ができているためにアニメーションが必要です。それで、それがアニメーションにとって最高の瞬間ではない場合、それはいつですか?

11
SilentKnight

syncState()とは

ドロワーを左または右にスワイプすると回転するドロワーアイコンが同期されます。syncState()を削除しようとすると、同期が失敗し、回転にバグが発生したり、機能しなくなります。

onPostCreate()内で呼び出す必要があるのはなぜですか?

onPostCreateが復元されたときにアニメーションを再度同期するために、Activityで呼び出されます。 onPostCreateの良いところは、onRestoreInstanceStateの直後に呼び出されることです。

編集:

@Vikramが述べているように、メソッドのインラインドキュメントを見ることができます syncState

12
Rod_Algonquin

アクティビティのonPostCreateからsyncState()を呼び出して、アクティビティがonRestoreInstanceState

1
Bojan Kseneman

簡単に言うと、SyncState()は、onRestoreInstanceStateが発生した後にトグル状態を同期することです。そして、それをonPostCreate(...)で呼び出すのは、onPostCreate(...)が呼び出された直後にonRestoreInstanceState(...)が呼び出されるためです。

0
Xcihnegn