Est-il possible de modifier les éléments du menu d'options par programme? Quelqu'un peut-il me donner un exemple s'il vous plaît?
De plus, je souhaite désactiver certains éléments, pour qu'ils n'écoutent pas les clics, est-ce possible?
Réponses:
Pour quiconque a besoin de changer les options du menu de manière dynamique:
private Menu menu;
// ...
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
this.menu = menu;
getMenuInflater().inflate(R.menu.options, menu);
return true;
}
// ...
private void hideOption(int id)
{
MenuItem item = menu.findItem(id);
item.setVisible(false);
}
private void showOption(int id)
{
MenuItem item = menu.findItem(id);
item.setVisible(true);
}
private void setOptionTitle(int id, String title)
{
MenuItem item = menu.findItem(id);
item.setTitle(title);
}
private void setOptionIcon(int id, int iconRes)
{
MenuItem item = menu.findItem(id);
item.setIcon(iconRes);
}
item.setVisible(false);
, l'élément n'est masqué que lorsque je clique sur le menu lui-même. Si j'utilise invalidateOptionsMenu();
l'élément, ne répondez pas au clic. J'apprécie si vous pouviez m'aider sur un problème similaire auquel je suis confronté. stackoverflow.com/questions/54756799/…
setVisible
états que vous devez également appeler setEnabled(false)
sinon l'élément peut toujours être invoqué via son raccourci
menu.xml
<item
android:id="@+id/item1"
android:title="your Item">
</item>
mettez votre fichier java
public void onPrepareOptionsMenu(Menu menu) {
menu.removeItem(R.id.item1);
}
Comme Nikolay l'a dit, faites cela dans onPrepareOptionsMenu ().
Pour les éléments de menu dans la barre d'actions, vous devez invalider le menu avec
activity.invalidateOptionsMenu();
Ceci est décrit plus en détail ici. Comment puis-je actualiser l'ActionBar lorsque onPrepareOptionsMenu a changé d'entrées de menu?
Si je dois changer le contenu de mon menu d'options, je l'exécute pendant le onMenuOpened (). Cela me permet de vérifier l'état de fonctionnement au moment même où l'utilisateur accède au menu.
public boolean onMenuOpened(int featureid, Menu menu)
{
menu.clear();
if (!editable)
{
MenuItem itemAdd = menu.add(0, REASSIGN, Menu.NONE, context.getString(R.string.reassign));
MenuItem itemMod = menu.add(1, EDIT, Menu.NONE, context.getString(R.string.modify));
MenuItem itemDel = menu.add(2, DELETE, Menu.NONE, context.getString(R.string.delete));
itemAdd.setShortcut('0', 'a');
itemMod.setShortcut('1', 'm');
itemDel.setShortcut('2', 'd');
}
else
{
MenuItem itemSave = menu.add(3, SAVE, Menu.NONE, context.getString(R.string.savechanges));
itemSave.setShortcut('0', 'S');
}
return true;
}
Pour désactiver certains éléments:
MenuItem item = menu.findItem(R.id.ID_ASSING_TO_THE_ITEM_IN_MENU_XML);
item.setEnabled(false);
item.setVisible(false);
, mon élément n'est masqué que lorsque je clique sur le menu lui-même (trois points). Si j'utilise invalidateOptionsMenu();
certains éléments, je ne réponds pas au clic. J'apprécie si vous pouviez m'aider sur un problème similaire auquel je suis confronté. stackoverflow.com/questions/54756799/…
en utilisant les lignes suivantes que j'ai faites pour ajouter les valeurs dans le menu
getActivity().invalidateOptionsMenu();
essayez ce travail comme un charme pour moi.
Essayez ce code:
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
this.menu=menu;
updateMenuItems(menu);
return super.onPrepareOptionsMenu(menu);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.document_list_activity_actions, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle presses on the action bar items
if (item.getItemId() == android.R.id.home) {
onHomeButtonPresssed();
}else if (item.getItemId() == R.id.action_delete) {
useCheckBoxAdapter=false;
deleteDocuments();
} else if (item.getItemId() == R.id.share) {
useCheckBoxAdapter=false;
shareDocuments();
} else if (item.getItemId() == R.id.action_tick) {
useCheckBoxAdapter=true;
onShowCheckboxes();
}
updateMenuItems(menu);
return true;
}
private void updateMenuItems(Menu menu){
if (useCheckBoxAdapter && menu != null) {
menu.findItem(R.id.action_delete).setVisible(true);
menu.findItem(R.id.share).setVisible(true);
menu.findItem(R.id.action_tick).setVisible(false);
} else {
menu.findItem(R.id.action_delete).setVisible(false);
menu.findItem(R.id.share).setVisible(false);
menu.findItem(R.id.action_tick).setVisible(true);
}
invalidateOptionsMenu();
}
invalidateOptionsMenu();
, mes éléments toujours visibles cessent de fonctionner (je veux dire que les éléments ne répondent pas au clic). J'apprécie si vous pouviez m'aider sur un problème similaire auquel je suis confronté. stackoverflow.com/questions/54756799/…
Vous pouvez faire quelque chose de simple comme moi. Changez simplement le texte selon ce qui est nécessaire lorsque vous appuyez sur l'élément de menu. J'avais besoin d'éteindre et d'allumer le son, plus la possibilité d'effectuer une action en le touchant. Voici mon code:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.audioOn:
audioOn = !audioOn;
if (audioOn)
item.setTitle("Audio Off");
else
item.setTitle("Audio On");
return true;
case R.id.touchOn:
touchOn = !touchOn;
if (touchOn)
item.setTitle("Touch Off");
else
item.setTitle("Touch On");
return true;
default:
return super.onOptionsItemSelected(item);
}
}
audioOn et touchOn sont des booléens vérifiés dans d'autres parties du code. J'espère que cela t'aides.
vous pouvez accomplir votre tâche simplement en mettant en œuvre comme ci-dessous:
private Menu menu;
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.drive_menu, menu);
return true;
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
this.menu = menu;
return super.onPrepareOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_toggle_grid) {
handleMenuOption(id);
return true;
} else if(id == R.id.action_toggle_list){
handleMenuOption(id);
return true;
}
return super.onOptionsItemSelected(item);
}
private void handleMenuOption(int id) {
MenuItem item = menu.findItem(id);
if (id == R.id.action_toggle_grid){
item.setVisible(false);
menu.findItem(R.id.action_toggle_list).setVisible(true);
}else if (id == R.id.action_toggle_list){
item.setVisible(false);
menu.findItem(R.id.action_toggle_grid).setVisible(true);
}
}
Dans le cas où vous avez un BottomBar:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
if (mBottomBar.getCurrentTabId() == R.id.tab_more) {
getMenuInflater().inflate(R.menu.more_menu, menu);
}
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.preferences:
startActivity(new Intent(this, PreferenceActivity.class));
break;
}
return super.onOptionsItemSelected(item);
}
Ensuite, il vous suffit d'appeler:
@Override
public void onBottomBarClick(int tabId) {
supportInvalidateOptionsMenu();
}
Code Kotlin pour accéder aux options de la barre d'outils par programme et modifier le texte / l'icône, ..:
1-Nous avons notre élément de menu dans le fichier des éléments de menu comme: menu.xml, exemple de code pour cela:
<?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/balance"
android:title="0"
android:orderInCategory="100"
app:showAsAction="always" />
</menu>
2- Définissez une variable pour accéder à l'objet menu en classe:
var menu: Menu? = null
3- paraphez-le dans onCreateOptionsMenu:
override fun onCreateOptionsMenu(menu: Menu): Boolean {
// Inflate the menu; this adds items to the action bar if it is present.
menuInflater.inflate(R.menu.main, menu)
this.menu = menu
return true
}
4- Accédez aux éléments de menu dans votre code ou amusez-vous:
private fun initialBalanceMenuItemOnToolbar() {
var menuItemBalance = menu?.findItem(R.id.balance)
menuItemBalance?.title = Balance?.toString() ?: 0.toString()
// for change icon : menuWalletBalance?.icon
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.calendar, menu);
if(show_list == true) {
if(!locale.equalsIgnoreCase("sk")) menu.findItem(R.id.action_cyclesn).setVisible(false);
return true;
}
menu
a été défini avant d'essayer d'en sortirMenuItem
. Par exemple, si vous avez quelque chose commeactionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS)
, les onglets sont chargés avant le menu, donc l'appel dehideOption
/showOption
withinonTabSelected
entraîne une exception de pointeur nul.