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;
}
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());
}
}
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
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é. :)
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.
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.
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.
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();
}
}
);
}
Essayez de changer le thème de l'application de Theme.AppCompat.Light.DarkActionBar à Theme.AppCompat.Light
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"/>