2013-01-18 15 views
9

Chcę zmienić widoczność pozycji menu działania fragmentu (abs), gdy tylko zmienię fragment w działaniu. Fragmenty to SherlockListFragments.Android: Zmiana widoczności elementów menu ze zmieniającym się fragmentem

Pozycje menu, które chcę pokazać/ukryć są błystki tworzę na tworzenie menu:

public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    MenuInflater inflater = getSupportMenuInflater(); 

    IcsSpinner herbSortSpinner = new IcsSpinner(this, null, R.attr.actionDropDownStyle); 
    SpinnerAdapter herbSortSpinnerAdapter = ArrayAdapter.createFromResource(this, R.array.herb_sort_elements, android.R.layout.simple_spinner_dropdown_item); 
    herbSortSpinner.setAdapter(herbSortSpinnerAdapter); 
    herbSortSpinner.setOnItemSelectedListener(this); 
    herbSortSpinner.setId(HERB_SPINNER_ID); 
    menu.add(R.string.menu_sort).setActionView(herbSortSpinner).setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); 

    IcsSpinner noteSortSpinner = new IcsSpinner(this, null, R.attr.actionDropDownStyle); 
    SpinnerAdapter noteSortSpinnerAdapter = ArrayAdapter.createFromResource(this, R.array.note_sort_elements, android.R.layout.simple_spinner_dropdown_item); 
    noteSortSpinner.setAdapter(noteSortSpinnerAdapter); 
    noteSortSpinner.setOnItemSelectedListener(this); 
    noteSortSpinner.setId(NOTE_SPINNER_ID); 
    menu.add(R.string.menu_sort).setActionView(noteSortSpinner).setVisible(false).setEnabled(false).setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); 

    inflater.inflate(R.menu.activity_lexicon, menu); 
    menuHolder.setMenu(menu); 
    return true; 
} 

Moja logika przełączania fragmenty to:

public boolean onNavigationItemSelected(int position, long itemId) { 

    FragmentManager fragmentManager = getSupportFragmentManager(); 
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
    switch(position) { 
    case 0: 
     List<Herb> herbList = findHerbsByIntent(getHerbLocale()); 
     HerbListFragment herbListFragment = new HerbListFragment(); 
     herbListFragment.setListAdapter(new HerbListAdapter(this, getHerbLocale(), herbList)); 
     fragmentTransaction.replace(R.id.fragment_container, herbListFragment, HERB_LIST_FRAGMENT_TAG); 
     //menuHolder.showHerbsSpinner(); 
     break; 
    case 1: 
     SymptomListFragment symptomListFragment = new SymptomListFragment(); 
     symptomListFragment.setListAdapter(new SymptomListAdapter(this, getDefaultSymptomLocale())); 
     fragmentTransaction.replace(R.id.fragment_container, symptomListFragment, SYMPTOM_LIST_FRAGMENT_TAG); 
     //menuHolder.showHerbsSpinner(); 
     break; 
    case 2: 
     NoteRepository noteRepository = new NoteRepository(this); 
     List<Note> notes = noteRepository.getNoticables(ReferedType.HERB); 
     NoteListFragment noteListFragment = new NoteListFragment(); 
     noteListFragment.setListAdapter(new NoteListAdapter(this, getHerbLocale(), notes)); 
     fragmentTransaction.replace(R.id.fragment_container, noteListFragment, NOTE_LIST_FRAGMENT_TAG); 
     //menuHolder.showNotesSpinner(); 
     break; 
    case 3: 
     FavoriteRepository favoriteRepository = new FavoriteRepository(this); 
     Set<Integer> favoriteHerbs = favoriteRepository.getFavorables(ReferedType.HERB); 
     List<Herb> favoriteHerbList = herbRepository.getHerbsByIds(favoriteHerbs, getHerbLocale()); 
     FavoriteHerbListFragment favoriteHerbListFragment = new FavoriteHerbListFragment(); 
     favoriteHerbListFragment.setListAdapter(new HerbListAdapter(this, getHerbLocale(), favoriteHerbList)); 
     fragmentTransaction.replace(R.id.fragment_container, favoriteHerbListFragment, HERB_LIST_FRAGMENT_TAG); 
     //menuHolder.showHerbsSpinner(); 
     break; 
    } 
    fragmentTransaction.commit(); 

    return true; 
} 

Moim pierwszym pomysłem było trzymać obiekt menu w klasie właściciela i manipuluj nim tam, ilekroć zmieniam fragment (w każdym przypadku powyżej).

static class MenuHolder { 

    private Menu mMenu; 

    void setMenu(Menu menu) { 
     mMenu = menu; 
    } 

    void showNotesSpinner() { 
     if (mMenu != null) { 
      mMenu.findItem(HERB_SPINNER_ID).setVisible(false).setEnabled(false); 
      mMenu.findItem(NOTE_SPINNER_ID).setVisible(true).setEnabled(true); 
     } 
    } 

    void showHerbsSpinner() { 
     if (mMenu != null) { 
      mMenu.findItem(NOTE_SPINNER_ID).setVisible(false).setEnabled(false);    
      mMenu.findItem(HERB_SPINNER_ID).setVisible(true).setEnabled(true); 
     } 
    } 
} 

Mój problem polega na tym, że nie ma pozycji menu o podanym ID, która jest lokalną stałą aktywności. Dostaję tutaj NPE. Czy ktoś ma pomysł, jak to naprawić? Czy istnieje lepszy sposób na zmianę menu przełączania fragmentów?

poważaniem Carsten

+0

Pomogłem sobie wczoraj. Oczyściłem swój bałagan z kodu (wstawiając fragmenty tylko raz w onCreate) i zapisałem pozycje menu bezpośrednio do posiadacza. Teraz działa jak urok. – modebm

Odpowiedz

20

Czy istnieje lepszy sposób na zmianę menu przełączania fragmenty?

Może być tak :).

Doc:

Zgłoś że ten fragment chciałby uczestniczyć w wypełnianie menu opcji odbieranie wywołania onCreateOptionsMenu (Menu, MenuInflater) i pokrewne metody.

Przygotuj menu opcji standardowego ekranu, który ma być wyświetlany. Jest to wywoływane tuż przed wyświetleniem menu, za każdym razem, gdy jest wyświetlane. Możesz użyć tej metody, aby skutecznie włączać/wyłączać elementy lub w inny sposób dynamicznie modyfikować zawartość.

Wtedy, w tej metodzie, starają się znaleźć swoje pozycje menu przez ID, i uczynić je widocznymi/unvisible, włączony/wyłączony, podobnie jak to:

@Override 
public void onPrepareOptionsMenu(Menu menu) {  
    menu.findItem(HERB_SPINNER_ID).setVisible(false).setEnabled(false); 
} 

Read More

+3

Ta odpowiedź zasługuje na znacznie więcej awansów. Jednak w PreferenceFragment, niezbędna procedura Override będzie: public void onPrepareOptionsMenu (menu menu) {/*..*/} Mimo to zaoszczędzisz mi dużo pracy. Dzięki. :) –

+1

pomógł mi również, dzięki, i mMenu powinno być menu, i nie powinno zwracać niczego, ponieważ jest to pustka. – fizgig

+0

Dzięki @fizgig. Odpowiedź edytowana :) –

0

W moim przypadku , Mam 2 fragmenty, które mają inny element menu.

Na moim główną działalność:

FragmentA fragmentA = new FragmentA(); 
fragmentA.setTargetFragment(fragmentA, 0); 
FragmentB fragmentB = new FragmentB(); 
fragmentB.setTargetFragment(fragmentB, 1); 

i Fragmenta i FragmentB posiada:

@Override 
public void onHiddenChanged(boolean hidden) { 
    super.onHiddenChanged(hidden); 
    if(hidden) { 
     getTargetFragment().setMenuVisibility(false); 
    }else{ 
     getTargetFragment().setMenuVisibility(true); 
    } 
} 

ten pozwoli menu z fragmentu A są widoczne gdy B opuszcza. Jeśli wróci z B do A, stare menu z A może być widoczne.

Numer referencyjny: here

Powiązane problemy