2011-10-19 17 views
9

we fragmencie, nazywa się w zakresie działalności Mam wyświetlania listy linii autobusowych tak:Zmiana ActionBar przy użyciu fragmentów

Page 1, when opening for the first time.

Wtedy, gdy użytkownik kliknie na „stacje”, lubię aby wyświetlić listę stacji oczywiście. Używam tego kodu:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.act_long_distance); 

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
    ft.add(R.id.f_long_distance, new LongDistanceFragment()).commit(); 
} 

@SuppressWarnings({"UnusedDeclaration"}) 
public void showStationList(View view) { 
    String tag = (String) view.getTag(); 
    if (tag != null && tag.length() > 0) { 
     FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
     StationListFragment fragment = new StationListFragment(tag.split(",")); 
     ft.add(R.id.f_long_distance, fragment); 
     // ft.replace(R.id.f_long_distance, fragment); 
     ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); 
     ft.addToBackStack(null); 
     ft.commit(); 
    } 
} 

XML dla tego działania jest:

<LinearLayout 
    android:id="@+id/ll_container" 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" 
    > 
    <FrameLayout 
     android:id="@+id/f_long_distance" 
     android:layout_weight="1" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     /> 
</LinearLayout> 

StationListFragment jest prosty ListFragment wyświetlane na drugim:

After clicking on the Station List button

To, co działa dobrze, to pasek akcji, teraz poprawnie zawiera tytuł tylko.

To, co nie działa, jeśli teraz naciśnij z powrotem. listy stacji jest ukryta, ale stary ActionBar nie zostanie przywrócona:

ActionBar after coming back from List button

Dokumenty mówią, że sposób, aby dodać ActionBar korzysta onCreateOptionsMenu metody itd

Więc w LongDistanceFragment (pierwszy pokazano), tworzę pasek tak:

@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 
    Log.d(TAG, "onViewCreated"); 
    super.onViewCreated(view, savedInstanceState); 

    setHasOptionsMenu(true); 
} 

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

    ActionBar bar = getSupportActivity().getSupportActionBar(); 
    bar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST); 
    bar.setListNavigationCallbacks(new SimpleSpinnerArrayAdapter(getActivity()), this); 
} 

Ale jakoś nie zostanie przywrócona, gdy użytkownik jest z powrotem w tym fragmentem.

Myślę, że potrzebny jest sposób na odzyskanie stanu paska akcji podczas wycofywania transakcji fragmentu.

Czego mi brakuje? Dzięki za pomoc.

+0

Walczę też z tym w tej chwili. Oto pokrewne pytanie. http://stackoverflow.com/questions/6503189/fragments-onresume-from-back-stack –

Odpowiedz

9

Jeśli dobrze rozumiem Twój kod, problem prawdopodobnie występuje w Twoim StationListFragment.

Pasek akcji jest powiązany z samym działaniem, a nie z określonym fragmentem w nim.

Zgaduję, że w ramach StationListFragment modyfikujesz pasek akcji, aby wyświetlić tytuł "Stacje" i wyłączyć tryb nawigacji po liście. W takim przypadku naciśnięcie przycisku cofania cofa transakcję - skutecznie usuwając StationListFragment - ale nie automagicznie cofa żadnych zmian, które można wprowadzić na pasku działań aktywności.

Co należy zrobić, to zastąpić jedną z procedur obsługi zmian stanu w obrębie fragmentu listy stacji, aby cofnąć zmiany w pasku akcji po jego usunięciu/ukryciu.

Lepszym rozwiązaniem byłoby wykorzystanie transakcji replace do wymiany LongDistanceFragment z StationListFragment (raczej niż dodawanie tego ostatniego na szczycie byłego). Następnie można dodać kod do konfiguracji na pasku akcji do każdego fragmentu więc ustaw go odpowiednio, gdy staną się widoczne (przez przesłonięcie onResume), zamiast próbować posprzątać po ich usunięciu.

+2

Żadne z procedur obsługi zmian stanu w ListFragment nie jest w ogóle wywoływane, więc nie masz możliwości robienia tego. To jest brak w API. –

+1

Używam Zamień, ale dodaję widok szczegółów do tylnego stosu. A następnie, po naciśnięciu przycisku Wstecz, żadne zdarzenie nie jest uruchamiane na liście, aby można było zresetować tytuł z powrotem .. –

+0

Następnie, gdzie on zmienia tytuł ActionBar? Opierając się na kodzie w tym przykładzie, nigdy nie powinien wyświetlać "Bus Line Stops" - muszę założyć, że dzieje się to w StationListFragment. –

1

Miałem do czynienia z tym samym problemem i kiedy przywracam zmiany w ActionBar w metodzie onStop drugiego fragmentu, działa dobrze.

Powiązane problemy