22

Ich habe folgendes Fragment in meiner Anwendung:onCreateOptionsMenu genannt nach onResume auf JB 4.2

public class MyFragment extends SherlockListFragment implements LoaderManager.LoaderCallbacks<Cursor> { 
    private MenuItem refresh = null; 

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

    //..... 

    // NPE here 
    refresh.setActionView(R.layout.indeterminate_progress_action); 
    getActivity().getSupportLoaderManager().initLoader(0, null, this); 
    } 

    @Override 
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
    inflater.inflate(R.menu.refresh_menu, menu); 
    refresh = (MenuItem) menu.findItem(R.id.menu_item_refresh); 
    } 

    @Override 
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) { 
    mAdapter.swapCursor(data); 
    refresh.setActionView(null); 
    } 
} 

Grundsätzlich, wenn der Benutzer startet die Aktivität Ich möchte einen Fortschritt Spinner angezeigt werden, in der Aktionsleiste, bis der Lader abgeschlossen ist. Vor Android 4.2 hat alles gut funktioniert. Auf Android 4.2 bekomme ich folgende Fehlermeldung:

11-24 13:37:14.811: E/AndroidRuntime(17850): Caused by: java.lang.NullPointerException 
11-24 13:37:14.811: E/AndroidRuntime(17850): at com.MyApp.library.fragments.MyFragment.onActivityCreated(TabFragment.java:65) 

Nach einiger Bruchstelle Zugabe wurde mir klar, onCreateOptionsMenu wurde nach onActivityCreated genannt zu werden. Gibt es ein anderes Lebenszyklus-Ereignis, das ich verwenden kann? Gibt es eine bessere Lösung, um den gewünschten Effekt zu erzielen?

+2

Ähm, warum Ihr 'setActionView nicht bewegen()' Aufruf 'onCreateOptionsMenu()', dann? Und vielleicht abhängig davon, ob die Ladung getan wird oder nicht? – CommonsWare

+0

Kinda funktioniert. Es scheint so, als würde 'onCreateOptionsMenu' auch nach' onLoadFinished' aufgerufen. Da ich Registerkarten mit mehreren Ladeprogrammen habe, ist 'hasRunningLoaders' nicht nützlich, um festzustellen, ob die Ladeoperation beendet ist. Ich denke, ich muss einen booleschen Wert verwenden, um den Zustand zu verfolgen. – Frohnzie

+6

Android-Problem: http://code.google.com/p/android/issues/detail?id=39721 – Frohnzie

Antwort

3

Ich habe onPrepareOptionsMenu auf diese Weise verwendet, um zu erreichen, was Sie versuchen zu tun. (nicht getestet, aber Sie sollten eine Idee geben.)

private boolean mIsLoading = true; 

@Override 
public void onPrepareOptionsMenu(Menu menu) { 
    super.onPrepareOptionsMenu(menu); 
    refresh = (MenuItem) menu.findItem(R.id.menu_item_refresh); 
    if (!mIsLoading) { 
     refresh.setActionView(null); 
    } 
} 

@Override 
public void onLoadFinished(Loader<Cursor> loader, Cursor data) { 
    mAdapter.swapCursor(data); 
    mIsLoading = false; 
    getActivity().invalidateOptionsMenu(); 
} 
+0

aufgerufen Wie kommt onPrepareOptionsMenu Methode zurück void; Ich glaube, ich habe gerade eine Katze gesehen. Angst vor meinem verdammten Verstand – DJphy

Verwandte Themen