onCreate
(メソッドの先頭に1つ、最後に1つ)にいくつかのブレークポイントを配置し、onCreateOptionsMenu
の先頭にも1つ挿入します。 onCreate
メソッドが最初に呼び出され、完了する前にonCreateOptionsMenu
メソッドが呼び出されます。
アプリでFragment
ナビゲーションコードを分離しようとしているので、アプリが電話/タブレットで実行されているかどうかに応じてonCreateOptionsMenu
を委任するオブジェクトがいくつかあります(使用しているこれを決定する画面サイズ、大画面用のレイアウトファイルには、レイアウトが膨らんだ後にチェックするビューがあります)。私が抱えている問題は、onCreateでこれらのオブジェクトを作成し、onCreateOptionsMenu
でオブジェクトを参照すると、nullポインター例外が発生することです。
OnCreateメソッドが最初に呼び出され、終了する前にonCreateOptionsMenuが呼び出されます。
これは、公式のハニカムスタイルのアクションバーを備えたデバイスやアプリに当てはまります。アクションバーがない場合、ユーザーがメニューを呼び出すまで(通常はMENUボタンを押して)、onCreateOptionsMenu()
は呼び出されません。
(私はこれを決定するために画面サイズを使用しています、大画面用のレイアウトファイルには、レイアウトが膨張した後にチェックするビューがあります)
アイスクリームサンドイッチが出荷されると、そのテストはまもなく終了します。私の知る限り、ICS電話にはアクションバーがあります(おそらくシステムバーはありません)。
私の場合、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:
OnResume()で呼び出す場合、私は見つけました
invalidateOptionsMenu();
その後、onCreateOptionsMenu(メニューメニュー)が呼び出されます-アクティビティライフサイクルに従って(ここでは正しい用語だと思います) 、@ tir38で示されるように
@Override
public void onResume() {
super.onResume();
invalidateOptionsMenu();
}
上記の答えに加えて、ICSとHoneycombの場合、onCreateOptionsMenuはonCreateとonPostCreateの後に呼び出されますが、Gingerbread以前のバージョンではonCreateの後、onPostCreateの前に呼び出されます。それが私が見つけた唯一の違いです。
私の経験では、ActionBarActivity
はサポートv7からonCreateOptionsMenu()
はsetContentView()
の途中でonCreate()
メソッドで呼び出され、4.1.1に表示されます。
しかし4.4では、別のストーリーonCreateOptionMenu()
がonCreate()
の後に呼び出されました。また、その直後かもしれませんが、そうでないかもしれません。しかし、その後の事実です。私は他のバージョンでテストしませんでしたが、4.1.1が最初で、初期化順序に問題がありました。
onResume()およびonCreateOptionsMenu()のタイミングの問題を回避するために、フラグメントにコールバック関数を作成することをお勧めします。
次の作業を行うことは私にとって完璧です:
例:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
if (this.myFragment != null) {
this.myFragment.doSomethingWithTheMenu(menu);
}
return true;
}