J'ai un PopupMenu
et je sais que la manière habituelle d’y associer un menu est d’utiliser popup.getMenuInflater().inflate(R.menu.my_menu, popup.getMenu());
ou quelque chose du genre. Mon problème est que j'ai un tableau d'éléments que je veux dans le menu et que je dois pouvoir les changer par programme en Java. Comment puis-je faire ceci?
Vient de le comprendre; pour tous ceux qui rencontrent le même problème, il suffit de faire:
popup.getMenu().add(groupId, itemId, order, title);
pour chaque MenuItem
que vous souhaitez ajouter.
Il suffit de créer le menu contextuel enregistrant la vue que celle-ci apparaîtra en dessous et d’utiliser la méthode getMenu () pour ajouter les valeurs. N'oubliez pas d'appeler show ();
PopupMenu menu = new PopupMenu(this, view);
menu.getMenu().add("titleRes");
menu.show();
Essaye ça:
Dynamic_PopUpMenu.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
PopupMenu menu = new PopupMenu(DialogCheckBox.this, v);
menu.getMenu().add("AGIL");
menu.getMenu().add("AGILarasan");
menu.getMenu().add("Arasan");
menu.show();
}
});
Définit les identifiants dans popupmenu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto">
<item
Android:id="@+id/slot1"
app:showAsAction="ifRoom|withText"
Android:title="Movies"
Android:visible="true"/>
<item
Android:id="@+id/slot2"
app:showAsAction="ifRoom|withText"
Android:title="Music"
Android:visible="true"/>
<item
Android:id="@+id/slot3"
app:showAsAction="ifRoom|withText"
Android:title="Comedy"
Android:visible="true"/>
</menu>
PopupMenu popupMenu = new PopupMenu(FullMenuActivity.this, view);
popupMenu.setOnMenuItemClickListener(FullMenuActivity.this);
popupMenu.getMenu().add(1, R.id.slot1, 1, "slot1");
popupMenu.getMenu().add(1,R.id.slot2,2,"slot2");
popupMenu.getMenu().add(1,R.id.slot3,3,"slot3");
popupMenu.show();
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.slot1:
SessionManager.selected_slot = item.getTitle().toString();
Toast.makeText(this, "slot1 Clicked", Toast.LENGTH_SHORT).show();
return true;
case R.id.slot2:
SessionManager.selected_slot = item.getTitle().toString();
Toast.makeText(this, "slot2 Clicked", Toast.LENGTH_SHORT).show();
return true;
case R.id.slot3:
SessionManager.selected_slot = item.getTitle().toString();
Toast.makeText(this, "slot3 Clicked", Toast.LENGTH_SHORT).show();
return true;
default:
return true;
}
}
Voici une solution complète avec les identifiants définis et gérés:
this.findViewById(R.id.hamburger_menu).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
PopupMenu menu = new PopupMenu(getApplicationContext(), v);
menu.getMenu().add(Menu.NONE, 1, 1, "Share");
menu.getMenu().add(Menu.NONE, 2, 2, "Comment");
menu.show();
menu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
int i = item.getItemId();
if (i == 1) {
//handle share
return true;
} else if (i == 2) {
//handle comment
return true;
} else {
return false;
}
}
});
}
});
Remarque: partage et commentaire sont par exemple, vous pouvez également mettre des constantes pour les nombres 1,2 pour rendre le code plus lisible.
Aussi, je mets Menu.NONE
parce que je me fiche de regrouper les éléments de menu. Si vous souhaitez que le groupe défini définisse le groupe id = 1, 2, etc.
@Voora Tarun a donné une bonne réponse, et j'ai basé ma réponse sur celle-ci: D'abord, utilisez plutôt faux mune.xml
ressources, je pense que la meilleure approche consiste à créer le fichier ids
à la place:
ids.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<item name="menuGroup" type="id"/>
<item name="menu1" type="id"/>
<item name="menu2" type="id"/>
<item name="menu3" type="id"/>
</resources>
Ensuite, vous pouvez faire quelque chose comme ça:
private void showPopup(final View anchor) {
PopupMenu popupMenu = new PopupMenu(anchor.getContext(), anchor);
popupMenu.getMenu().add(R.id.menuGroup, R.id.menu1, Menu.NONE, "slot1");
popupMenu.getMenu().add(R.id.menuGroup, R.id.menu1, Menu.NONE,"slot2");
popupMenu.getMenu().add(R.id.menuGroup, R.id.menu1, Menu.NONE,"slot3");
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
Toast.makeText(anchor.getContext(), item.getTitle() + "clicked", Toast.LENGTH_SHORT).show();
return true;
}
});
popupMenu.show();
}