studio programacion herramientas fundamentos con avanzado aplicaciones android android-actionbar android-menu

programacion - manual de android en pdf



Activar/Desactivar elemento de menú de la barra de acción (4)

Tengo la barra de acción menuitems cancelar y guardar.

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>

Quiero deshabilitar guardar menuitem cuando se inicia la actividad.

Mi código de actividad -

@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{ } }

Entonces, lo que estoy tratando de hacer aquí es, inicialmente, cuando se inicia la actividad, el elemento del menú debe estar deshabilitado y cuando el editext contiene texto, debe estar habilitado.

No estoy seguro de cuál debería ser el código en el método configureSaveButton. También, ¿cómo puedo desactivar el elemento de menú guardar inicialmente.

Obtengo una excepción de puntero nulo en onPrepareOptionsMenu.

Estoy usando Android 4.1


Después de luchar durante 1 hora después de este estúpido problema, la única solución que funcionó para mí es:

almacenar el menú en una variable local:

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

Luego cambie el estado habilitado simplemente llamando:

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

Y puedes deshabilitarlo inicialmente solo en el xml ...


Encontré este post porque quería lograr el mismo resultado. Ninguna de las otras respuestas fue completamente útil para que esto funcionara para mí. Después de un poco de investigación, prueba y error conseguí el mío para trabajar. Así que decidí compartir mis resultados.

Variables que he creado para esta tarea:

MenuItem save_btn; boolean b = false;`

A continuación, configure el menú de la barra de acción:

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

Como la variable boolean b se inicializa como falsa, save_btn se deshabilita cuando se crea la actividad.

Este es el método para alternar save_btn usando el ejemplo @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; } }

Este método se llama a través de la función TextWatcher() para el cuadro onCreate() en onCreate() nuevamente usando el ejemplo @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 última pieza del rompecabezas fue agregar el método invalidateOptionsMenu() .

La parte que se me ocurrió que hizo que el mío funcionara fue utilizar la variable boolean b para cambiar el estado de save_btn .


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

Simplemente infle el tiempo de preparación y desactive después del menú inflado, no es necesario inflate en el tiempo de oncreateoptionemenu o puede usar las dos últimas líneas de código después de inflar desde onCreateOptionMenu .

@Override public boolean onPrepareOptionsMenu(Menu menu) { menu.getItem(0).setEnabled(false); // here pass the index of save menu item return super.onPrepareOptionsMenu(menu); }


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

Con este método, su elemento de menú se deshabilitará cada vez que se compruebe su condición, y se habilitará si no lo está.