2012-09-11 16 views
8

Okay, ho FavoritesList estendere GalleryList che si estende ListFragment:ListFragment onPrepareOptionsMenu chiamato prima onCreate. Perché e come risolvere/bypassare?

public static class FavoritesList extends GalleryList { 

    public static FavoritesList newInstance(int page) { 
     FavoritesList list = new FavoritesList(); 

     Bundle args = new Bundle(); 
     args.putInt("page", page); 
     list.setArguments(args); 

     return list; 
    } 

    @Override 
    public void onCreate(Bundle saveInstanceState) { 
     super.onCreate(saveInstanceState); 

     Cursor cursor = dbHelper.getGalleries(fav, preferences.getString("sort"+fav, "date desc")); 
     listAdapter = new GalleryListAdapter(activity, cursor); 
     setListAdapter(listAdapter); 
    } 

    ... 

    @Override 
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
     super.onCreateOptionsMenu(menu, inflater); 
     menu.add(Menu.NONE, 0, 8, "Remove All"); 
    } 

    @Override 
    public void onPrepareOptionsMenu(Menu menu) { 
     super.onPrepareOptionsMenu(menu); 

     //listAdapter is null the first time this is called... 

     if (listAdapter != null && listlistAdapter.getCount() == 0) { 
      menu.findItem(R.id.filter).setEnabled(false); 
      menu.findItem(0).setEnabled(false); 
     } 
     else { 
      menu.findItem(R.id.filter).setEnabled(true); 
      menu.findItem(0).setEnabled(true); 
     } 
    } 
} 

Ecco il problema: si chiama onPrepareOptionsMenu prima onCreate (dove inizializzo listAdapter) durante il caricamento di questo frammento, e isn 't chiamato di nuovo prima che il menu delle opzioni è mostrato per la prima volta!

Il Fragment documentation è semplicemente sbagliato quando afferma onPrepareOptionsMenu "si chiama destra prima viene visualizzato il menu, ogni volta è dimostrato."

p.s. Sto usando la libreria di supporto Android (v4). Qualche idea?

risposta

2

Così, tanto sciocco quanto questo è, qui è una soluzione funzionante:

public static class FavoritesList extends GalleryList { 

    Menu optionsMenu; 

    ... 

    @Override 
    public void onCreate(Bundle saveInstanceState) { 
     super.onCreate(saveInstanceState); 

     Cursor cursor = dbHelper.getGalleries(fav, preferences.getString("sort"+fav, "date desc")); 
     listAdapter = new GalleryListAdapter(activity, cursor); 
     setListAdapter(listAdapter); 

     if (optionsMenu != null) { 
      onPrepareOptionsMenu(optionsMenu); 
     } 
    } 

    ... 

    @Override 
    public void onPrepareOptionsMenu(Menu menu) { 
     super.onPrepareOptionsMenu(menu); 

     optionsMenu = menu; 

     if (listAdapter != null && listAdapter.getCount() == 0) { 
      menu.findItem(R.id.filter).setEnabled(false); 
      menu.findItem(0).setEnabled(false); 
     } 
     else { 
      menu.findItem(R.id.filter).setEnabled(true); 
      menu.findItem(0).setEnabled(true); 
     } 
    } 
} 

Fondamentalmente ho afferrato il menu delle opzioni durante la prima esecuzione di onPrepareOptionsMenu, poi lo chiamò ancora una volta che listAdapter è stato inizializzato.

modifica: evidentemente senza verificare se optionsMenu è null, questo si interromperà su determinati telefoni. Avrei dovuto capire.

2

provare a chiamare invalidateOptionsMenu() sul onCreate(). Assicurati di controllare se la scheda elenco è null su onPrepareOptionsMenu().

+0

invalidateOptionMenu è disponibile solo dal livello di API 11 mentre il mio minSdkVersion è 8. Inoltre, sembra solo per essere a disposizione di attività, non Frammenti. –

Problemi correlati