2012-09-11 10 views
8

bien, así que tengo FavoritesList extendiéndose GalleryList cuales se extiende ListFragment:ListFragment onPrepareOptionsMenu llama antes onCreate. ¿Por qué y cómo arreglar/anular?

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); 
     } 
    } 
} 

aquí está el problema: onPrepareOptionsMenu se llama antes onCreate (donde inicializar listAdapter) al cargar este fragmento, y ISN 't llamado de nuevo antes de que el menú de opciones se muestra por primera vez!

El Fragment documentation es simplemente equivocado cuando afirma onPrepareOptionsMenu "se llama justo antes de se muestra el menú, cada vez que se muestra."

p.s. Estoy usando la Biblioteca de soporte de Android (v4). ¿Algunas ideas?

Respuesta

2

Así, tan tonto como esto es, aquí es una solución que funcione:

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); 
     } 
    } 
} 

Básicamente me consiguió el menú de opciones durante la primera ejecución de onPrepareOptionsMenu, entonces lo llamaron de nuevo una vez listAdapter se ha inicializado.

edit: evidentemente sin verificar si optionsMenu es nulo, esto se romperá en ciertos teléfonos. Debería haberme dado cuenta.

2

intentar llamar a invalidateOptionsMenu() en su onCreate(). Asegúrese de verificar si el adaptador de la lista es null en onPrepareOptionsMenu().

+0

invalidateOptionMenu sólo está disponible desde el nivel del API 11 mientras que mi minSdkVersion es 8. Además, sólo parece estar disponible para actividades, no Fragmentos. –

Cuestiones relacionadas