web-dev-qa-db-ja.com

Android:アクティビティのライフサイクル中にonCreateOptionsMenuが呼び出されるのはいつですか?

onCreate(メソッドの先頭に1つ、最後に1つ)にいくつかのブレークポイントを配置し、onCreateOptionsMenuの先頭にも1つ挿入します。 onCreateメソッドが最初に呼び出され、完了する前にonCreateOptionsMenuメソッドが呼び出されます。

アプリでFragmentナビゲーションコードを分離しようとしているので、アプリが電話/タブレットで実行されているかどうかに応じてonCreateOptionsMenuを委任するオブジェクトがいくつかあります(使用しているこれを決定する画面サイズ、大画面用のレイアウトファイルには、レイアウトが膨らんだ後にチェックするビューがあります)。私が抱えている問題は、onCreateでこれらのオブジェクトを作成し、onCreateOptionsMenuでオブジェクトを参照すると、nullポインター例外が発生することです。

141

OnCreateメソッドが最初に呼び出され、終了する前にonCreateOptionsMenuが呼び出されます。

これは、公式のハニカムスタイルのアクションバーを備えたデバイスやアプリに当てはまります。アクションバーがない場合、ユーザーがメニューを呼び出すまで(通常はMENUボタンを押して)、onCreateOptionsMenu()は呼び出されません。

(私はこれを決定するために画面サイズを使用しています、大画面用のレイアウトファイルには、レイアウトが膨張した後にチェックするビューがあります)

アイスクリームサンドイッチが出荷されると、そのテストはまもなく終了します。私の知る限り、ICS電話にはアクションバーがあります(おそらくシステムバーはありません)。

105
CommonsWare

私の場合、Android 2.3でv4サポートライブラリのFragmentActivityを使用すると、ライフサイクルメソッドの呼び出し順序は次のようになります。

07-18 18:29:21.629  20183-20183/? I/onCreate:
07-18 18:29:21.719  20183-20183/? I/onStart: 
07-18 18:29:21.719  20183-20183/? I/onResume: 
07-18 18:29:21.739  20183-20183/? I/onCreateOptionsMenu:
51
Lemberg

OnResume()で呼び出す場合、私は見つけました

invalidateOptionsMenu();

その後、onCreateOptionsMenu(メニューメニュー)が呼び出されます-アクティビティライフサイクルに従って(ここでは正しい用語だと思います) 、@ tir38で示されるように

@Override
public void onResume() {
    super.onResume();
    invalidateOptionsMenu();
}
25
Gene Bo

上記の答えに加えて、ICSとHoneycombの場合、onCreateOptionsMenuはonCreateとonPostCreateの後に呼び出されますが、Gingerbread以前のバージョンではonCreateの後、onPostCreateの前に呼び出されます。それが私が見つけた唯一の違いです。

21

私の経験では、ActionBarActivityはサポートv7からonCreateOptionsMenu()setContentView()の途中でonCreate()メソッドで呼び出され、4.1.1に表示されます。

しかし4.4では、別のストーリーonCreateOptionMenu()onCreate()の後に呼び出されました。また、その直後かもしれませんが、そうでないかもしれません。しかし、その後の事実です。私は他のバージョンでテストしませんでしたが、4.1.1が最初で、初期化順序に問題がありました。

3
Yevgen Kulik

onResume()およびonCreateOptionsMenu()のタイミングの問題を回避するために、フラグメントにコールバック関数を作成することをお勧めします。

次の作業を行うことは私にとって完璧です:

  1. フラグメントを作成してアクティビティに追加します
  2. このフラグメントの参照をアクティビティに残します
  3. フラグメントにパブリックメソッドdoSomethingWithTheMenu()を作成します
  4. onCreateOptionsMenu(Menu menu)が呼び出されたときに、アクティビティ内からこのメソッドを呼び出します。

例:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    if (this.myFragment != null) {
        this.myFragment.doSomethingWithTheMenu(menu);
    }
    return true;
}
2
datayeah