2013-05-12 23 views
11

'de iki kez çağrıldı Fragmanların başında değişen seçenekler menüsü ile basit bir uygulama var. Sorun şu ki, ilk onCreateOptionsMenu() dışında herhangi bir parçanın iki kere - onCreate() içinde ve onResume() öğesinden sonra çağrılmasıdır. OnCreate() 'da setHasOptionsMenu (true) ile manuel olarak adlandırıyorum ancak onResume()' den sonra bu olmamalı. Ayrıca, bu sadece ilk parça başladıktan sonra ortaya çıkar.onCreateOptionsMenu() Fragman

class BaseFragment extends Fragment { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setHasOptionsMenu(true); 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle clicks 
     return true; 
    } 

    @Override 
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
     // Create a menu 
     super.onCreateOptionsMenu(menu, inflater); 
    } 
} 

Ve Aktivite değişen fragmanları kodu: Burada

baz fragmanları kodudur

public void startFragment(BaseFragment fragment) { 
    getSupportFragmentManager() 
    .beginTransaction() 
    .replace(android.R.id.content, fragment) 
    .commit(); 
} 

örnek ActionBarSherlock, sadece SupportLibrary gibi herhangi bir dış kitaplık kullanmaz. Sanırım, ilk fragman başladığında sorun olduğu için sorun FragmentTransaction replace() yöntemindedir. Ama bilmiyorum, sorunu çözmeye nereden başlayalım. Görünümde tam olarak parça değiştirmeye ihtiyacım var.

+0

kullandığınız telefon? Telefonda ayrık bir menü düğmesi varsa, onCreateOptionsMenu sadece kullanıcı tıkladığında çağrılır. Eklemek için setHasOptionsMenu'nun (true) onCreateOptionsMenu çağırması zorunlu değildir. Sadece menü doldururken parçanın katılmak istediği çerçeveyi bilgilendirir. – prijupaul

+0

OP, aynı soruna sahip olduğumda soruyu eklememe/düzenlememe bile izin vermiyor. Menü ile ilgili temel şeyleri biliyorum, sorun OP'nin tarif ettiği gibi garip. DÜZENLEME: İç içe geçmiş parçayı – Zyoo

+0

@ prijupaul kullanıyorum, aslında sadece Honeycomb öncesi versiyonları için. Honeycomb ve daha sonra onCreateOptionsMenu üzerinde setHasOptionsMenu() çağırdıktan hemen sonra çağrılır. – bvitaliyg

cevap

-1

Menü öğesini tutmazsanız, onOptionsItemSelected() öğesinin üst sınıf uygulamasını çağırmalısınız (varsayılan uygulama yanlış döndürür).

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    return super.onOptionsItemSelected(item); 
} 
+0

neden aşağı oy ??? neyin yanlış? –

+0

Ben onun soru üzerinde onCreateOptionsMenu ile ilgili olduğunu düşünüyorum ve cevabınız onCreateOptionMenu ve yaşam döngüsü ile uygun olmayan onResume ile yapmaktır. – prijupaul

+0

Hayır. Manuel olarak değil. SetHasOptionsMenu (true) çağrıldığında, sadece parçanın menüye sahip olduğu çerçeveyi bildirir. Çerçeve, uygun olduğunda istenen işlevi çağırır. Bu, true değerine ayarlanmazsa, çerçeve parçalarda oncreateoptionsmenu'yu çağırmayacaktır. – prijupaul

2

Yeni eklenen parça sanırımCreateOptionsMenu'daki etkinliklerin yeniden çağrılmasına neden oluyor!

1>

setRetainInstance (doğru) ekleme deneyin;

Oluşturucu parçalamak için!

public BaseFragment() 
{ 
    setRetainInstance(true); 
    setHasOptionsMenu(true); 
} 

Bu kaydetmek/dönme üzerine

sorunu fragmanlarının her birinin tek tek durumlarını geri yükler (zaman etkinliği yok edilir Android parçasını yok etmez gerçeğine ilişkili gibi görünmektedir cihaz döndürülür).

ben bu burada Jake Wharton bulundu SO

Güncelleme: 2> başka yolu da yapıcı/newInstance yöntemini çağırarak onları el başlatmasını da düzen dosyada parçaları ekleyerek ve kaçınmaktır.

Mizanpaja bir parça eklerseniz, android framework sizin için başlatacaktır. Parçaları el ile eşleştirmek yerine, örneği FragmentManager.getFragmentById ile çağırıp bunun yerine bu örneği kullanmalısınız.

yüzden her zaman

@Override 
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
      menu.clear(); 
      inflater.inflate(R.menu.call_menu, menu); 
      super.onCreateOptionsMenu(menu, inflater); 

    } 
+1

hayır, bunun cevabı olduğunu düşünmüyorum. Tabii ben yukarıda bahsedilen tüm çalıştı ama yine de @Zyoo sorununuza için başka bir çözüm var ben bunu – Zyoo

+0

sınamak her olur? –

+0

Üzgünüm, hayır, optionmenu kullanmaya karar verdim, ama gelecekte gerekli olacağını düşünüyorum, bu yüzden hala deniyorum – Zyoo

0

Belki de bu şekilde deneyebilirsiniz menu.clear() arayarak

3> bununla deneyin sizin parçaları için bir kimlik ve/veya bir etiket içerir:

private final int MENU_SEARCH=Menu.FIRST; 
: 
    @Override public void onPrepareOptionsMenu(Menu menu) { 
     if (menu.findItem(MENU_SEARCH)==null) { 
      menu.add(0, MENU_SEARCH, Menu.NONE, getText(R.string.menu_search)); 
: 

IeMenü öğelerinizden birinin menüde var olup olmadığını kontrol edin ve değilse, muhtemelen hepsinin eklenmesi gerekir.

7

Ben geç partiye değilim biliyorum ama aynı sorunu olursa koştu ve benim çözüm açıkça benim SupportFragments onCreate işlevi

setHasOptionsMenu(false); 

eklemek aslında. Bu, onCreateOptionsMenu ve onPrepareOptionsMenu etkinliklerine yapılan ek çağrıları engeller. Bu yardımcı olur umarım.

2

Sorunu çözmenin en kolay yolu, şişirilmeden hemen önce menüyü temizlemektir. menu.clear() var olan menüyü temizler ve yeni bir tane ile başlayacaktır.

@Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
     super.onCreateOptionsMenu(menu, inflater); 
     menu.clear(); 
     inflater.inflate(R.menu.sample_menu, menu); 
}