61 votes

Comment puis-je actualiser le ActionBar lorsque onPrepareOptionsMenu a changé de menu?

Dans mes applications, j'souvent activer/désactiver les entrées de menu et de ne les rendre visibles à partir de onPrepareOptionsMenu.

Aujourd'hui, j'ai commencé à ajouter les android:showAsAction menu attribut de certains de mes Android 2.x des applications pour afficher les entrées de menu utilisée pour la plupart sur l'ActionBar.

L'ActionBar ne reflète pas l'activer/désactiver la visibilité et immédiatement. J'ai besoin de cliquer sur le menu déroulant sur la droite pour voir ce changement.

Ok, je comprends que le menu feux onPrepareOptionsMenu. Mais que dois-je faire pour actualiser l'ActionBar. Je pense que cette modification doit être appliquée à partir de l'intérieur de onOptionsItemSelected mais je ne sais pas ce que je devrais l'appeler.

Merci à l'avance.

Voici le menu:

<item
    android:icon="@drawable/ic_menu_mapmode"
    android:id="@+id/men_mapview"
    android:showAsAction="ifRoom|withText"
    android:title="@string/txt_mapview" />

<item
    android:icon="@drawable/ic_menu_mapmode"
    android:id="@+id/men_satelliteview"
    android:showAsAction="ifRoom|withText"
    android:title="@string/txt_satelliteview" />

Voici la onPrepareOptionsMenu:

@Override
public boolean onPrepareOptionsMenu(final Menu menu) {
    MenuItem menuItemMapView = menu.findItem(R.id.men_mapview);
    MenuItem menuItemSatelliteView = menu.findItem(R.id.men_satelliteview);

    if (mapView.isSatellite()) {
        menuItemMapView.setEnabled(true).setVisible(true);
        menuItemmenuItemSatelliteView.setEnabled(false).setVisible(false);
    } else {
        menuItemMapView.setEnabled(false).setVisible(false);
        menuItemmenuItemSatelliteView.setEnabled(true).setVisible(true);
    }

    return super.onPrepareOptionsMenu(menu);
}

Voici la onOptionsItemSelected

@Override
public boolean onOptionsItemSelected(final MenuItem menuItem) {
    switch (menuItem.getItemId()) {
        case R.id.men_mapview:
            mapView.setSatellite(false);
            mapView.setStreetView(true);
            mapView.invalidate();

            invalidateOptionsMenu(); // This works on Android 3.x devices only
            return true;
        case R.id.men_satelliteview:
            mapView.setSatellite(true);
            mapView.setStreetView(false);
            mapView.invalidate();

            invalidateOptionsMenu(); // This works on Android 3.x devices only
            return true;
    }

    return super.onOptionsItemSelected(menuItem);
}

EDIT: Si j'ajoute invalidateOptionsMenu cela fonctionne sur Android 3.x apps mais se bloque sur Android 2.x appareils en raison d'un manque de méthode. Ce qui est de la manière souhaitée pour le faire droit.

85voto

wirbly Points 1052

Ma méthode de choix consiste à créer une classe d'assistance. Par exemple:

 class VersionHelper
{
    static void refreshActionBarMenu(Activity activity)
    {
        activity.invalidateOptionsMenu();
    }
}
 

Maintenant, dans votre code ci-dessus, remplacez invalidateOptionsMenu(); par:

 if (Build.VERSION.SDK_INT >= 11)
{
    VersionHelper.refreshActionBarMenu(this);
}
 

Le crédit pour cette méthode va à CommonsWare (recherchez HoneycombHelper et consultez ses livres - hautement recommandé)

67voto

jeremyvillalobos Points 701

Merci à la réponse acceptée. J'utilise ActionBarActivity. dans cette classe, vous pouvez utiliser

 supportInvalidateOptionsMenu();
 

14voto

Urizev Points 321

Utilisation

 ActivityCompat.invalidateOptionsMenu(Activity activity)
 

de la bibliothèque de compatibilité .

Voir: http://stackoverflow.com/a/14748687/435855

11voto

Klaasvaak Points 1433

enregistrer une référence au menu et appeler:

 this.menu.clear();
this.onCreateOptionsMenu(this.menu);
 

4voto

Farfelufrank Points 11

Vous pouvez maintenant utiliser supportInvalidateOptionsMenu() la méthode de la ActionbarActivity avec le soutien de la bibliothèque. Si vous n'avez pas à vérifier la version du kit de développement. Va jusqu'API 7 et ci-dessus.

http://developer.android.com/reference/android/support/v7/app/ActionBarActivity.html

à le faire, vous devez importer la v7 de la bibliothèque de prise en charge à l'aide de cette

http://developer.android.com/tools/support-library/setup.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X