Android: Kapan onCreateOptionsMenu dipanggil selama siklus hidup Aktivitas?

149

Saya menempatkan beberapa breakpoints onCreate(satu di awal, dan satu di akhir metode), dan saya juga meletakkan satu di awal onCreateOptionsMenu. The onCreatemetode ini disebut pertama, dan sebelum selesai onCreateOptionsMenudisebut.

Saya mencoba untuk memisahkan Fragmentkode navigasi di aplikasi saya, jadi saya punya beberapa objek yang saya delegasikan onCreateOptionsMenutergantung pada apakah aplikasi berjalan di ponsel / tablet (saya menggunakan ukuran layar untuk menentukan ini, file layout saya untuk layar besar memiliki tampilan yang saya periksa setelah tata letak meningkat). Masalah yang saya alami adalah, saya membuat objek-objek ini di onCreate, dan saya mendapatkan pengecualian null pointer ketika saya referensi objek di onCreateOptionsMenu.

Christopher Perry
sumber

Jawaban:

112

Metode onCreate disebut pertama, dan sebelum selesai onCreateOptionsMenu dipanggil.

Itu akan berlaku pada perangkat dan aplikasi dengan bilah tindakan bergaya Honeycomb resmi. Jika tidak ada bilah tindakan, onCreateOptionsMenu()jangan dipanggil sampai pengguna membuka menu, biasanya dengan menekan tombol MENU.

(Saya menggunakan ukuran layar untuk menentukan ini, file tata letak saya untuk layar besar memiliki tampilan yang saya periksa setelah tata letak meningkat)

Tes itu akan pecah sangat singkat, begitu Ice Cream Sandwich dikirim. Dari apa yang saya tahu, ponsel ICS akan memiliki panel tindakan (meskipun mungkin bukan panel sistem).

CommonsWare
sumber
Saya lupa menyebutkan bahwa saya menggunakan perpustakaan ActionbarSherlock. Jawaban Anda mengingatkan saya. Mungkin itulah alasan perilaku ini, karena ini adalah pembungkus pada pustaka kompatibilitas, yang menempatkan item menu di "ActionBar".
Christopher Perry
@commonsware - Artinya pada perangkat dan aplikasi yang tidak memiliki panel tindakan. Menu akan muncul bahkan jika onCreateOptionsMenu tidak menampilkan item?
NinjaCoder
12
dalam kasus saya panggilan onCreateMenu setelah onResume
Kostya Khuta
1
Ya saya memiliki masalah yang sama ... Tapi kode saya terkait dengan Fragmen.
Yoann Hercouet
Saya mulai mengalami NPEketika memeriksa apakah nav drawer fragmentitu terbuka onCreateOptionsMenu. Saya harus meletakkan cek nol di onCreateOptionsMenu aktivitas, serta callback yang digunakan fragmen di onCreateOptionsMenu. Sungguh aneh karena itu hanya terjadi pada beberapa layar, tetapi secara konsisten pada mereka.
theblang
54

Dalam kasus saya di Android 2.3 dan dengan FragmentActivitydari pustaka dukungan v4 urutan metode siklus hidup yang dipanggil adalah sebagai berikut:

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:
Roman Nazarevych
sumber
27

Saya menemukan jika di onResume () saya menelepon

invalidateOptionsMenu();

kemudian onCreateOptionsMenu (Menu menu) dipanggil sesudahnya - sesuai siklus hidup aktivitas (saya pikir itu istilah yang benar di sini) , seperti yang ditunjukkan oleh @ tir38

@Override
public void onResume() {
    super.onResume();
    invalidateOptionsMenu();
}
Gene Bo
sumber
4
Jika Anda menggunakan actionbarsherlock maka panggil metode inisupportInvalidateOptionsMenu();
Shan Xeeshi
3
Berhati-hatilah saat Anda mengatakan "segera". Itu tidak akan benar-benar terjadi segera. Saat Anda invalidateOptionsMenu, pekerjaan untuk (kembali) membuat menu opsi akan ditambahkan ke antrian pesan UI. Apa pun yang ada dalam antrian akan dijalankan terlebih dahulu.
tir38
21

Selain jawaban di atas, Dalam kasus ICS dan Honeycomb onCreateOptionsMenu dipanggil setelah onCreate dan onPostCreate sementara di Gingerbread dan versi sebelumnya disebut setelah onCreate tetapi sebelum onPostCreate. Itulah satu-satunya perbedaan yang saya temukan.

Pawan Maheshwari
sumber
3

Dalam pengalaman saya ActionBarActivitydari dukungan v7 onCreateOptionsMenu()disebut setContentView()metode di tengah-tengah onCreate()itu muncul pada 4.1.1.

Tetapi pada 4.4 cerita lain onCreateOptionMenu()dipanggil setelah onCreate(). Juga saya tidak tahu itu mungkin segera setelah itu, mungkin tidak. Tapi itu fakta setelahnya. Saya tidak menguji pada versi lain tetapi 4.1.1 adalah yang pertama di mana saya memiliki masalah dengan urutan init.

Yevgen Kulik
sumber
Mungkin Anda perlu menggunakan supportInvalidateOptionsMenu()?
David d C e Freitas
2

saya sarankan untuk membuat fungsi panggil balik di fragmen Anda untuk menghindari masalah waktu dengan onResume () dan onCreateOptionsMenu ().

melakukan pekerjaan berikut tanpa cacat untuk saya:

  1. buat dan tambahkan fragmen Anda ke aktivitas Anda
  2. tinggalkan referensi fragmen ini dalam aktivitas Anda
  3. buat metode publik doSomethingWithTheMenu () di fragmen Anda
  4. panggil metode ini dari dalam aktivitas Anda saat onCreateOptionsMenu (Menu menu) dipanggil.

contoh:

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