web-dev-qa-db-fra.com

Android la barre d'action n'indique pas le débordement

J'ai une barre d'action dans mon application avec 3 éléments.

Seuls 2 peuvent être affichés en raison de problèmes d'espace. Je m'attendrais donc à ce que le premier soit affiché et le reste affiché dans le débordement. Cependant, dans la pratique, seuls les 2 premiers éléments sont affichés et aucun débordement n'est détectable.

Voici le code approprié: list_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android" >
<item Android:id="@+id/menu_insert"
    Android:icon="@Android:drawable/ic_menu_add"
    Android:title="@string/menu_insert" 
    Android:showAsAction="ifRoom|withText"/>
<item Android:id="@+id/menu_call"
    Android:icon="@Android:drawable/ic_menu_call"
    Android:title="@string/menu_call" 
    Android:showAsAction="ifRoom|withText"/>
<item Android:id="@+id/menu_agenda"
    Android:icon="@Android:drawable/ic_menu_agenda"
    Android:title="@string/menu_agenda" 
    Android:showAsAction="ifRoom|withText"/>
</menu>

Activité.Java

public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater mi = getMenuInflater();
    mi.inflate(R.menu.list_menu, menu);
    return true;
}
90
Mats Raemen

Si vous souhaitez afficher les trois points, quel que soit le bouton de menu de l'appareil! alors vous pouvez appeler cette méthode dans la méthode onCreate de votre classe d'application

private void makeActionOverflowMenuShown() {
    //devices with hardware menu button (e.g. Samsung Note) don't show action overflow menu
    try {
        ViewConfiguration config = ViewConfiguration.get(this);
        Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey");
        if (menuKeyField != null) {
            menuKeyField.setAccessible(true);
            menuKeyField.setBoolean(config, false);
        }
    } catch (Exception e) {
        Log.d(TAG, e.getLocalizedMessage());
    }
}
125
Atul Kaushik

Action Bar

res/menu/menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android" >

    <!-- Search / will display always -->
    <item
        Android:id="@+id/action_search"
        Android:icon="@drawable/ic_action_search"
        Android:showAsAction="always"
        Android:title="@string/action_search"/>

    <!-- Location Found -->
    <item
        Android:id="@+id/action_location_found"
        Android:icon="@drawable/ic_action_location_found"
        Android:showAsAction="always"
        Android:title="@string/action_location_found"/>

    <!-- More -->
    <item
        Android:id="@+id/a_More"
        Android:icon="@drawable/ic_action_overflow"
        Android:showAsAction="always"
        Android:title="More">
        <menu>

            <!-- Refresh -->
            <item
                Android:id="@+id/action_refresh"
                Android:icon="@drawable/ic_action_refresh"
                Android:showAsAction="never"
                Android:title="@string/action_refresh"/>

            <!-- Help -->
            <item
                Android:id="@+id/action_help"
                Android:icon="@drawable/ic_action_help"
                Android:showAsAction="never"
                Android:title="@string/action_help"/>

            <!-- Check updates -->
            <item
                Android:id="@+id/action_check_updates"
                Android:icon="@drawable/ic_action_refresh"
                Android:showAsAction="never"
                Android:title="@string/action_check_updates"/>
        </menu>
    </item>

</menu>

MainActivity.Java

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.menu, menu);

        return super.onCreateOptionsMenu(menu);
    }

}

Téléchargez le jeu d’icônes Action Bar Icon

54
Kirit Vaghela

Je réalise que ce n’est pas un menu à débordement, mais c’est semblable. Ok, c'est simple mais c'était difficile à comprendre.

Vous avez d’abord besoin d’un élément de menu que vous souhaitez utiliser comme gonfleur de débordement. Exemple

<item
        Android:id="@+id/a_More"
        Android:icon="@drawable/more"
        Android:showAsAction="always"
        Android:title="More">
        </item>

Une fois que vous avez votre article, ajoutez un sous-menu contenant vos articles souhaités dans le menu débordement. Exemple:

<item
    Android:id="@+id/a_More"
    Android:icon="@drawable/more"
    Android:showAsAction="always"
    Android:title="More">
    <menu>
        <item
            Android:id="@+id/aM_Home"
            Android:icon="@drawable/home"
            Android:title="Home"/>
    </menu>
</item>

Au clic, cela va gonfler d'autres objets à l'intérieur. Mon application utilise ActionBarSherlock 4.0, donc avant que cela fonctionne pour vous, vous devez accéder à "SplitActionBar". (Fonctionne toujours par défaut Android Actionbar)

Voici comment: Dans votre fichier AndroidManifest.xml, vous devez ajouter ce code sous l'activité dans laquelle vous avez besoin du menu de débordement.

Android:uiOptions="splitActionBarWhenNarrow"

NOTE: Votre article qui gonfle votre menu de débordement DOIT showAsAction="always"

Vwola! vous avez un menu de débordement! J'espère que je vous ai aidé. :)

42
LeviRockerSk8er

Sur les appareils dotés de boutons de menu matériels (Galaxy S3, Samsung Samsung, etc.), le menu de dépassement de capacité se comporte comme le menu "traditionnel" en utilisant le bouton de menu Matériel.

26
Lukas Batteau

Lorsque vous dites menu "débordement", voulez-vous dire que les trois points qui apparaissent à la fin indiquent qu'il y a plus d'éléments ... ou voulez-vous dire la barre d'actions divisée qui apparaît en bas pour les éléments à débordement?

Si vous voulez parler de la barre d’action divisée, vous devriez l’ajouter au fichier manifeste de votre activité.

Android:uiOptions="splitActionBarWhenNarrow"

Par défaut, le menu de débordement de trois points devrait apparaître automatiquement. Il est donc difficile de déterminer le problème à partir des informations fournies ci-dessus.

5
wnafee

Pour toujours montrer le débordement d'action (trois points) sur actionbarcompat:
dans le fichier de menu, exemple:
main.xml

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto" >

    <item
        Android:id="@+id/action_settings"
        Android:title="@string/action_settings"
        app:showAsAction="never"/>
    <item
        Android:id="@+id/action_about"
        Android:title="@string/action_about"
        app:showAsAction="never"/>

</menu>

et dans le fichier d'activité:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main, menu);
    return super.onCreateOptionsMenu(menu);
}

Cela a bien fonctionné pour moi.
Testé sur Google Nexus S, Samsung S3.

5
MrSiro

Il semble que sur les appareils dotés d'un bouton de menu, le menu de débordement n'apparaisse pas dans la barre d'actions. De plus, nous n'avons aucun moyen de savoir si un périphérique dispose d'un bouton de menu matériel avant niveau 14 de l'API (4.0+).

Cette solution ajoute un bouton de débordement à un Android.support.v7.app.ActionBar Qui ouvre le menu des options standard sur les versions antérieures à Honeycomb (<3.0), sinon le laisse au système. Dans tous les cas, vous pouvez choisir entre always ou ifRoom pour toutes les actions.

Obtenez l’icône de débordement dans le Action Bar Icon Pack .

Ajouter un menu (je laisse des parties non pertinentes comme des titres, des commandes, etc.)

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
      xmlns:app="http://schemas.Android.com/apk/res-auto">

<item
    Android:id="@+id/action_overflow"
    Android:orderInCategory="100"
    Android:icon="@drawable/ic_action_overflow"
    app:showAsAction="always" />

<item
    Android:id="@+id/action_first"
    app:showAsAction="always" />

<item
    Android:id="@+id/action_second"
    app:showAsAction="ifRoom" />

</menu>

Supprimer notre action de débordement sur 3.0+

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        menu.removeItem(R.id.action_overflow);
    }
    return super.onPrepareOptionsMenu(menu);
}

Enfin, appelez Activity.openOptionsMenu() à partir de l’action de débordement.

Euh non. Vous ne pouvez pas ne pas appeler openOptionsMenu() à partir d'un bouton de menu ... mais si vous utilisez AndroidAnnotations vous avez terminé facilement:

@OptionsItem
void action_overflow() {
    openOptionsMenuDeferred();
}

@UiThread
void openOptionsMenuDeferred() {
    openOptionsMenu();
}

Sinon, vous devriez faire quelque chose comme ça, je suppose

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId() == id.action_overflow) {
        openOptionsMenuDeferred();
        return true;
    }
}

private Handler handler = new Handler(Looper.getMainLooper());
public void openOptionsMenuDeferred() {
    handler.post(new Runnable() {
        @Override
        public void run() {
            openOptionsMenu();
        }
    }
    );
}
3
IlDan

Essayez de changer le thème de l'application de Theme.AppCompat.Light.DarkActionBar à Theme.AppCompat.Light

2
Sagar Devanga

Mettez xmlns:your_app_name="http://schemas.Android.com/apk/res-auto" dans la balise de menu et à la place Android:showAsAction="always" utilisation your_app_name:showAsAction="always"

pour par exemple

<item
    Android:id="@+id/action_search"
    Android:icon="@drawable/icon_search"
    Android:title="@string/search"
    your_app_name:showAsAction="ifRoom"/>
2
Rashmi Jain