161 votes

Comment forcer l’utilisation du menu de dépassement de capacité sur les périphériques avec touche menu

J'aimerais avoir tous les éléments de menu qui ne rentre pas dans l'ActionBar allez dans le menu contextuel (celui qui est atteint à partir de la Barre d'Action de ne pas le bouton de menu) , même sur les appareils qui ne disposent d'un bouton de Menu. Cela semble beaucoup plus intuitive pour les utilisateurs de les jeter dans un menu séparé liste qui demande à l'utilisateur de sauter du touch(écran) de l'interaction d'un bouton d'interaction sur la base simplement parce que la mise en page de l'ActionBar ne peut pas tenir sur la barre.

Sur l'émulateur, je peux mettre le "Matériel/Touches d'Accueil" la valeur "non" et à obtenir cet effet. J'ai cherché un moyen de le faire dans le code pour un appareil qui a un bouton de menu, mais ne peut pas fine. Quelqu'un peut-il m'aider?

325voto

Timo Ohr Points 5550

Vous pouvez également utiliser ce petit hack ici:

    try {
        ViewConfiguration config = ViewConfiguration.get(this);
        Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey");
        if(menuKeyField != null) {
            menuKeyField.setAccessible(true);
            menuKeyField.setBoolean(config, false);
        }
    } catch (Exception ex) {
        // Ignore
    }

Bon endroit pour mettre ce serait l' onCreate-Méthode de votre classe d'Application.

Il va forcer l'Application à afficher le menu contextuel. Le bouton de menu fonctionne toujours, mais il va ouvrir le menu dans le coin supérieur droit.

[Edit] Depuis qu'il est venu plusieurs fois: Ce hack ne fonctionne que pour les natifs de l'ActionBar introduit dans Android 3.0, pas ActionBarSherlock. Ce dernier utilise sa propre logique interne afin de décider si vous souhaitez afficher le menu contextuel. Si vous utilisez ABS, toutes les plates-formes < 4.0 sont gérées par l'ABS et sont donc soumis à sa logique. Le hack aura encore du travail pour tous les appareils avec Android 4.0 ou plus (vous pouvez ignorer en toute sécurité Android 3.x, car il n'y a pas vraiment de comprimés avec un bouton de menu).

Il existe un spécial ForceOverflow-Thème qui va forcer le menu en ABS, mais apperently il est va être supprimé dans les versions futures en raison de complications.

54voto

Alexander Lucas Points 10258

EDIT: Modifié pour répondre à la situation de la physique bouton menu.

C'est effectivement empêché par la conception. Selon la Section Compatibilité de Android Guide de Conception,

"...l'action de débordement est disponible dans le menu de la clé matérielle. Les actions qui en découlent, popup... est affiché au bas de l'écran."

Vous remarquerez dans les captures d'écran, téléphones avec un physique bouton de menu ne disposez pas d'un menu contextuel dans l'ActionBar. Cela évite toute ambiguïté pour l'utilisateur, essentiellement avoir de deux boutons pour ouvrir le menu identique.

Pour aborder la question de la cohérence entre les appareils: en fin de compte, il est plus important de l'expérience de l'utilisateur de votre application se comporter de manière cohérente avec toute autre application sur le même appareil, que de se comporter de manière cohérente avec elle-même sur tous les appareils.

35voto

Berťák Points 1389

J’utilise pour la solution de contournement il en définissant mon menu comme ça (aussi avec ActionBarSherlock icône utilisée dans mon exemple) :

J’avoue que cela peut nécessiter « débordement-gestion manuelle » dans votre fichier xml, mais j’ai trouvé cette solution utile.

Vous pouvez également forcer le périphérique à utiliser le bouton HW pour ouvrir le menu de dépassement de capacité, dans votre activité :

-)

11voto

a fair player Points 2514

Si vous utilisez la barre d’action de la bibliothèque de support ( `` ), utilisez la syntaxe suivante :

7voto

Eli Revah Points 639

Ce type de méthode est empêché par le système de conception aux développeurs Android, mais j’ai trouvé un moyen pour réussir :

Ajouter ceci à votre fichier de menu XML :

Ensuite, créez une classe nommée « AppPickActionProvider » et copiez le code suivant à elle :

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