web-dev-qa-db-fra.com

Activer/désactiver le menu ActionBar

J'ai des menus d'actionbar annuler et enregistrer.

menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android" >
    <item Android:id="@+id/saveButton" 
          Android:showAsAction="always"          
          Android:title="@string/save" 
          Android:visible="true">

    </item>
    <item Android:id="@+id/cancelButton" 
          Android:showAsAction="always"         
          Android:title="@string/cancel" 
          Android:visible="true">        
    </item>

</menu>

Je veux désactiver la sauvegarde de menuitem au début de l'activité.

Mon code d'activité -

@Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.add_project);

        EditText projectName = (EditText) findViewById(R.id.editTextProjectName);   
        projectName.addTextChangedListener(new TextWatcher() {

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                configureSaveButton(s);             
            }           
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count,int after) {}
            @Override
            public void afterTextChanged(Editable s) {}
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.addprojectmenu, menu);      
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        MenuItem item = (MenuItem) findViewById(R.id.saveButton);
        item.setEnabled(false);     
        return super.onPrepareOptionsMenu(menu);
    }

    private void configureSaveButton(CharSequence s){
        String text = null;
        if(s != null){
            text = s.toString();
        }       
        if(text != null && text.trim().length() != 0){

        }else{

        }
    }

Donc, ce que j'essaie de faire ici, c’est que lorsque l’activité est démarrée, l’option de menu de sauvegarde doit être désactivée et lorsque editext contient du texte, il doit être activé. 

Je ne suis pas sûr de ce que devrait être le code si sinon dans la méthode configureSaveButton . Aussi, comment puis-je désactiver l'élément de menu de sauvegarde initialement.

Je reçois une exception de pointeur null dans onPrepareOptionsMenu.

J'utilise Android 4.1

24
Coder
@Override
public boolean onPrepareOptionsMenu(Menu menu) {

    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.addprojectmenu, menu);      

    menu.getItem(0).setEnabled(false); // here pass the index of save menu item
    return super.onPrepareOptionsMenu(menu);

}

Gonflez-le simplement au moment de la préparation et désactivez-le après le menu gonflé sans avoir besoin de inflate dans oncreateoptionemenu heure ou vous pouvez simplement utiliser les deux dernières lignes de code après avoir gonflé de onCreateOptionMenu.

@Override
public boolean onPrepareOptionsMenu(Menu menu) {

    menu.getItem(0).setEnabled(false); // here pass the index of save menu item
    return super.onPrepareOptionsMenu(menu);

}
28
Pratik

J'ai trouvé ce post parce que je voulais obtenir le même résultat. Aucune des autres réponses n'a été complètement utile pour que cela fonctionne pour moi. Après quelques recherches et essais et erreurs, le mien s'est mis au travail. J'ai donc décidé de partager mes résultats.

Variables que j'ai créées pour cette tâche:

MenuItem save_btn;
boolean b = false;`

Puis configurez le menu Actionbar:

    @Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.update_menu_item, menu);
    save_btn = (MenuItem) menu.findItem(R.id.action_save);
    return true;
}

@Override
public boolean onPrepareOptionsMenu(Menu menu){
    save_btn.setEnabled(b);
    super.onPrepareOptionsMenu(menu);       
    return true;
}

Puisque la variable boolean b est initialisée à false, le save_btn est désactivé lors de la création de l'activité.

Voici la méthode pour basculer le save_btn à l'aide de l'exemple @OpenSourceRulzz:

private void updateSaveButton (CharSequence s){
    String text = null;
    if(s != null){
        text = s.toString();
    }
    if(text != null && text.trim().length() != 0){
        b = true;
    }
    else{
        b = false;
    }
}

Cette méthode est appelée par la fonction TextWatcher() pour la zone EditText dans onCreate() en utilisant à nouveau l'exemple @OpenSourceRulzz.

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.add_project);

    EditText projectName = (EditText) findViewById(R.id.editTextProjectName);   
    projectName.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            updateSaveButton(s);
            invalidateOptionsMenu();
        }           
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,int after){}
        @Override
        public void afterTextChanged(Editable s) {}
    });
}

La dernière pièce du puzzle consistait à ajouter la méthode invalidateOptionsMenu().

La partie que j'ai créée et qui rendait le travail mien consistait à utiliser la variable boolean b pour basculer l'état de save_btn.

14
mjwheat

Après avoir lutté pendant 1 heure après cette question stupide, la seule solution qui a fonctionné pour moi est la suivante:

stocker le menu dans une variable locale:

Menu menu;

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    this.menu = menu;
    getMenuInflater().inflate(R.menu.menu_main, menu);
    return true;
}

Puis changez le statut activé en appelant simplement:

menu.findItem(R.id.action_save).setEnabled(true);

Et vous pouvez d'abord le désactiver juste dans le xml ...

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    if (your condition) {
        menu.findItem(R.id.saveButton).setEnabled(false);
    } else {
        menu.findItem(R;id.saveButton).setEnabled(true);
    }     
    return super.onPrepareOptionsMenu(menu);
}

Avec cette méthode, votre élément de menu sera désactivé chaque fois que votre condition est vérifiée, et sera activé sinon.

0
Alain Delgrange