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
@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);
}
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
.
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.