2013-08-14 16 views
6

Próbuję pokazać/ukryć elementy w moim pasku akcji w zależności od tego, który fragment jest widoczny.Zmiana stanu menu paska akcji w zależności od fragmentu

W moim główną działalność Mam następujący

/* Called whenever invalidateOptionsMenu() is called */ 
@Override 
public boolean onPrepareOptionsMenu(Menu menu) { 

    if(this.myFragment.isVisible()){ 
     menu.findItem(R.id.action_read).setVisible(true); 
    }else{ 
     menu.findItem(R.id.action_read).setVisible(false); 
    } 

    return super.onPrepareOptionsMenu(menu); 
} 

Działa to doskonale jednak, gdy urządzenie jest obracany jest problemem. Po zakończeniu rotacji naPrepareOptionsMenu jest wywoływany ponownie jednak ten czas this.myFragment.isVisible() zwraca wartość false ... i dlatego element menu jest ukryty, gdy wyraźnie widoczny jest fragment (w zakresie pokazanym na ekranie).

+0

Nie jesteś pewien, ale czy używasz tego samego fragmentu zarówno w trybie pionowym, jak i poziomym, czy też dodajesz inne fragmenty w trybie poziomym? Podczas rotacji po ponownym zainicjowaniu się jesteś pewien, że dołącza się do FragmentActivity. Możesz to sprawdzić za pomocą fragment.isAdded()? –

+0

Tak, w działaniu na metodęCreate robię: this.myFragment = new MyListFragment(); a następnie this.myFragment odwołuje się przez całą aktywność –

Odpowiedz

-3

Edycja: Jest to szybka i brudna poprawka, poniżej, aby uzyskać lepsze rozwiązanie, patrz es0329's answer.

Spróbuj dodać ten atrybut do tagu activity w android manifeście:

android:configChanges="orientation|screenSize" 
+0

Dzięki, idealnie –

+2

Zastanawiam się, czy programiści Android kiedykolwiek będą mogli puścić tej konwencji. Inne rozwiązanie zamieszczone tutaj jest znacznie lepsze. –

+0

Po raz pierwszy widziałem zaakceptowaną odpowiedź z głosami w dół. LOL!!! –

0

Spróbuj użyć Fragment na setRetainInstance(true); gdy fragment jest dołączony do działania. W ten sposób twój fragment zachowa bieżące wartości i wywoła cykl życia, gdy urządzenie zostanie obrócone.

24

podstawie Fragments API Guide, możemy dodać elementy do paska akcji na zasadzie per-Fragment z następujących etapów: Tworzenie res/menu/fooFragmentMenu.xml który zawiera elementy menu jak zwykle dla standardowego menu.

<menu xmlns:android="http://schemas.android.com/apk/res/android" > 
    <item 
     android:id="@+id/newAction" 
     android:orderInCategory="1" 
     android:showAsAction="always" 
     android:title="@string/newActionTitle" 
     android:icon="@drawable/newActionIcon"/> 
</menu> 

Ku górze onCreate metody FooFragment za wskazują, że ma własne elementy menu do dodania.

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

Zastąp onCreateOptionsMenu, gdzie można nadmuchać menu fragmentu i dołączyć go do standardowego menu.

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

Zastąp onOptionItemSelected w swoim fragmencie, która jest wywoływana, gdy tylko ten sam sposób na aktywny host/FragmentActivity widzi, że nie ma sprawy do wyboru.

+0

Brilliant. Dzięki. –

+0

W jaki sposób możemy zapewnić nawigację przycisku wstecz/do góry? –

+0

Może to być członek zespołu Google Android. Bardzo Bóg ! –

Powiązane problemy