web-dev-qa-db-fra.com

Essayer de masquer et d'afficher des éléments de menu sur la barre d'action

J'ai parcouru les questions sur le dépassement de capacité de la pile et ne trouve pas la solution.

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.themenu, menu);
    MenuItem   item = menu.findItem(R.id.menu_settings);
    MenuItem item2 = menu.findItem(R.id.menu_save);
    item.setVisible(isdown);
    item2.setVisible(isdown);
    return true;
}

Cela rend visibles les éléments de mon menu (item1 et item2). le onclick fonctionne bien

public void inflateTextarea() {
    if(isdown == true) {
        isdown = false;
        LinearLayout tl = (LinearLayout)findViewById(R.id.content);
        tl.setVisibility(View.VISIBLE);
        ScaleAnimation scale =  new ScaleAnimation(1, 1, 0, 1);
        scale.setFillAfter(true);
        scale.setDuration(500);
        tl.startAnimation(scale);
    }
}

Ensuite, cela définit my isdown boolean sur false. Sur la pile, les utilisateurs disent que le onPrepareOptionsMenu devrait se déclencher à chaque fois que je clique mais ce n'est pas le cas.

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch(item.getItemId()) {
        case R.id.menu_settings: 
            Log.v("Log:","edit_item pressed");
            return true;
    }
}

Mais j'ai plusieurs éléments de menu que je dois cacher et d'autres que je veux montrer. Comment puis-je m'y prendre?

12
Dnaso

Ce n'est pas suffisant pour changer la variable isDown. Vous devez appeler la méthode setVisible() chaque fois que vous souhaitez modifier la visibilité. Cette méthode fait plus que simplement définir une valeur booléenne, donc il ne suffit pas de changer une valeur booléenne.

Après avoir défini la valeur isDown sur false, vous devez appeler invalidateOptionsMenu() pour relancer le menu en appelant à nouveau onPrepareOptionsMenu().

Essayez ce code pour rendre les éléments de menu invisibles:

...
isdown = false;
invalidateOptionsMenu();
...
19
tbkn23

Essaye ça,

private Menu menu=null;
@Override
public void onCreateOptionsMenu(Menu menu,MenuInflater inflater)
{
    inflater.inflate(R.menu.note_menu, menu);
    this.menu=menu;
super.onCreateOptionsMenu(menu,inflater);
menu.findItem(R.id.menuChartNoteEdit).setVisible(isdown);
menu.findItem(R.id.menuChartOpenNote).setVisible(isdown);
}

Lorsque vous voulez masquer le menu à n’importe quel endroit, après avoir exécuté onCreateOptionsMenu() , Changez simplement la valeur de isdown et répétez ce code,

menu.findItem(R.id.menu_settings).setVisible(isdown);
menu.findItem(R.id.menu_save).setVisible(isdown);
11
Sino Raj

J'ai un menu avec deux éléments, d'abord: enregistrer l'élément, ensuite: éditer l'élément. Je voulais quand je suis entré pour éditer, au début, "enregistrer l'élément" avait été masqué, et lorsque je cliquais sur "éditer l'élément", "enregistrer l'élément" était affiché.

Alors: 

  1. déclarer un article en public
  2. définissez la valeur dans onCreateOptionsMenu(Menu menu, MenuInflater inflater)
  3. définir la visibilité sur isHidden()
  4. puis chaque fois que je voulais, définissez la visibilité sur isVisible()

Région publique:

MenuItem saveItem;

onCreateOptionsMenu:

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.menu_detail_products, menu);
    saveItem = (MenuItem) menu.findItem(R.id.action_detail_product_save);
    saveItem.setVisible(isHidden());
}

Où je veux:

saveItem.setVisible(isVisible());

Finalement ça marche comme je voulais.

0
mortezahosseini

Essayez ceci dans votre FragmentActivity

public boolean onPreparePanel(int featureId, View view, Menu menu) {
    if(isLeftMenuOpened()) return false;
    return super.onPreparePanel(featureId, view, menu);
}

Méthode FragmentActivity.onPreparePanel crée un menu pour tous les fragments attachés. Vous devez retourner la valeur true pour que le menu soit affiché. si vous retournez false, cela ne sera pas affiché.

0
user1275972