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


149

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

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

回答:


112

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

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

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

Ice Cream Sandwichが出荷されると、そのテストはすぐに失敗します。私の知る限りでは、ICS電話にはアクションバーがあります(システムバーではないかもしれませんが)。


ActionbarSherlockライブラリを使用していることを忘れていました。あなたの答えは私に思い出させました。これは、メニュー項目を「ActionBar」に配置する互換性ライブラリのラッパーであるため、おそらくこの動作の理由です。
Christopher Perry

@commonsware-これは、アクションバーのないデバイスやアプリを意味します。onCreateOptionsMenuに項目が表示されていなくてもメニューは表示されますか?
NinjaCoder 2013

12
私の場合、onResumeの後のonCreateMenuコール
Kostya Khuta '19

1
はい、同じ問題があります...しかし、私のコードはフラグメントに関連しています。
Yoann Hercouet 14

がで開いているNPEかどうかを確認するときに、私は持ち始めnav drawer fragmentましたonCreateOptionsMenu。アクティビティのonCreateOptionsMenuと、フラグメントがそのonCreateOptionsMenuで使用していたコールバックの両方にnullチェックを配置する必要がありました。いくつかの画面でのみ発生していたため、本当に奇妙でしたが、一貫してそれらの画面で発生しました。
theblang 2014年

54

私の場合、Android 2.3およびFragmentActivityv4-supportライブラリからの場合、ライフサイクルメソッドの呼び出し順序は次のとおりです。

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:

27

onResume()で呼び出すかどうかを見つけました

invalidateOptionsMenu();

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

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

4
uがactionbarsherlockを使用している場合は、このメソッドを呼び出しますsupportInvalidateOptionsMenu();
Shan Xeeshi

3
「今すぐ」と言うときは注意してください。それは本当にすぐには起こりません。するとinvalidateOptionsMenu、オプションメニューを(再)作成するジョブがUIのメッセージキューに追加されます。キューにある他のものが最初に実行されます。
tir38

21

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


3

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

しかし、4.4に別の話onCreateOptionMenu()が続きましたonCreate()。また、すぐ後であるかもしれないし、そうでないかもしれません。しかし、事実です。他のバージョンではテストしていませんが、4.1.1が最初に、initの順序に問題がありました。


おそらくあなたは使う必要がありますsupportInvalidateOptionsMenu()か?
David d C e Freitas 2015年

2

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;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.