Android: Etkinlik yaşam döngüsü sırasında onCreateOptionsMenu ne zaman çağrılır?


149

Bir kaç kesme noktası koydum onCreate(biri başında, diğeri yöntemin sonunda), ve ben de başında bir tane koydum onCreateOptionsMenu. onCreateYöntem ilk olarak adlandırılır ve tamamlanmadan önce olduğu onCreateOptionsMenudenir.

FragmentUygulamamdaki gezinme kodunu ayırmaya çalışıyorum , bu yüzden onCreateOptionsMenuuygulamanın telefon / tablette çalışıp çalışmadığına bağlı olarak temsil ettiğim birkaç nesne var (bunu belirlemek için ekran boyutunu kullanıyorum, büyük ekranlarda, yerleşim şişirildikten sonra kontrol ettiğim bir Görünüm bulunur). Yaşadığım sorun onCreate bu nesneleri oluşturmak, ve ben nesneyi başvuruda bir boş işaretçi özel durum alıyorum onCreateOptionsMenu.

Yanıtlar:


112

Önce onCreate yöntemi, bitmeden önce onCreateOptionsMenu çağrılır.

Bu, resmi Honeycomb tarzı bir eylem çubuğuna sahip cihazlarda ve uygulamalarda geçerli olacaktır. İşlem çubuğu onCreateOptionsMenu()yoksa, kullanıcı menüyü çağırıncaya kadar, genellikle MENÜ düğmesine basarak çağrılmamalıdır.

(Bunu belirlemek için ekran boyutunu kullanıyorum, büyük ekranlar için düzen dosyamda, düzen şişirildikten sonra kontrol ettiğim bir Görünüm var)

Ice Cream Sandwich gönderildikten sonra bu test çok kısa bir süre içinde sona erecek. Söyleyebileceğim kadarıyla, ICS telefonlarının eylem çubukları olacak (belki de sistem çubukları olmasa da).


ActionbarSherlock kütüphanesini kullandığımı belirtmeyi unuttum. Cevabınız bana hatırlattı. Muhtemelen bu davranışın nedeni budur, çünkü uyumluluk kütüphanesinde menü öğelerini "ActionBar" a koyan bir paket.
Christopher Perry9

@commonsware - Bu, işlem çubuğu olmayan cihazlarda ve uygulamalarda anlamına gelir. OnCreateOptionsMenu'da öğe görünmese bile menü görünecek mi?
NinjaCoder

12
onResume
Kostya Khuta

1
Evet aynı sorunum var ... Ama kodum bir Fragment ile ilgili.
Yoann Hercouet

Açık NPEolup olmadığını kontrol ederken sahip olmaya başladım . Hem etkinliğin onCreateOptionsMenu hem de parçanın onCreateOptionsMenu'da kullandığı geri çağırmada boş denetimler koymak zorunda kaldım. Gerçekten tuhaf çünkü sadece birkaç ekranda, ama sürekli olarak bu ekranlarda oluyordu. nav drawer fragmentonCreateOptionsMenu
theblang

54

Benim durumumda Android 2.3 ve FragmentActivityv4-destek kitaplığı ile çağırmak yaşam döngüsü yöntemleri sırası aşağıdaki gibidir:

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 () 'de aradığımı buldum

invalidateOptionsMenu();

sonra onCreateOptionsMenu (Menü menüsü) daha sonra çağrılır - @ tir38 ile belirtildiği gibi , aktivite yaşam döngüsüne göre (burada doğru terim olduğunu düşünüyorum)

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

4
U actionbarsherlock kullanıyorsanız o zaman bu yöntemi çağırınsupportInvalidateOptionsMenu();
Shan Xeeshi 30:14

3
"Hemen" derken dikkatli olun. Gerçekte hemen gerçekleşmeyecek. Siz invalidateOptionsMenu, seçenekler menüsünü (yeniden) oluşturmak için bir iş kullanıcı arayüzünün ileti kuyruğuna eklenir. Sırada başka ne varsa önce çalıştırılır.
tir38

21

Yukarıdaki yanıta ek olarak, ICS ve Honeycomb onCreateOptionsMenu durumunda Gingerbread ve önceki sürümlerde onCreate ve onPostCreate'den sonra onCreate'den sonra ama onPostCreate'dan önce çağrılır. Bulduğum tek fark bu.


3

Deneyimlerime göre ortada yöntem denilen ActionBarActivityv7 desteği 4.1.1 görünür.onCreateOptionsMenu()setContentView()onCreate()

Ancak 4.4'te başka bir hikaye daha onCreateOptionMenu()aradı onCreate(). Ayrıca hemen sonra olabileceğini de bilmiyorum, belki de değil. Ama gerçek sonra. Diğer sürümlerde test yapmadım, ancak 4.1.1 init siparişinde sorun yaşadığım ilk yer.


Belki de kullanmalısın supportInvalidateOptionsMenu()?
David d C e Freitas

2

onResume () ve onCreateOptionsMenu () ile zamanlama sorunları önlemek için parçanızda bir geri çağırma işlevi oluşturmanızı öneririz.

aşağıdaki işleri benim için kusursuz yapmak:

  1. parçanızı oluşturup etkinliğinize ekleyin
  2. faaliyetinizde bu parçanın bir referansını bırakın
  3. parçanızda genel bir yöntem doSomethingWithTheMenu () oluşturun
  4. onCreateOptionsMenu (Menü menüsü) çağrıldığında etkinliğinizin içinden bu yöntemi çağırın.

misal:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    if (this.myFragment != null) {
        this.myFragment.doSomethingWithTheMenu(menu);
    }
    return true;
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.