Listado completo de tutoriales

44 - Componente ActionBar (Básica)


A partir de la versión 4.0 se introduce para el desarrollo de aplicaciones para celulares Android la componente ActionBar.
La componente ActionBar es la barra que aparece en la parte superior de gran cantidad de aplicaciones. Esta componente busca estandarizar entre distintas aplicaciones desarrolladas para Android la ubicación de botones de acciones, menú de opciones etc.

En el lado izquierdo aparece el nombre de la aplicación y del lado derecha aparece un botón que al ser presionado nos muestra un menú desplegable:

ActionBar

Problema:

Confeccionar una aplicación que muestre en el ActionBar el título "Este mundo" y luego tres opciones en el menú desplegable del ActionBar.

La interfaz del ActionBar y el menú desplegable debe ser similar a:

ActionBar

Crear un proyecto llamado: Proyecto047

Veamos los pasos que debemos dar para obtener este resultado:

  1. El título del ActionBar lo debemos modificar abriendo el archivo strings que se encuentra en la carpeta res/values y su contenido por defecto al crear el proyecto es:

    <resources>
        <string name="app_name">Proyecto047</string>
    </resources>
    

    Podemos cambiar el contenido de la constante "app_name":

    <resources>
        <string name="app_name">Este mundo</string>
    </resources>
    

    Recordemos que este archivo de recursos se utiliza para agrupar todos los mensajes que aparecen en pantalla y facilitar la implementación de aplicaciones para varios idiomas independiente de los algoritmos de la misma.

    En este archivo se crea un string llamado "app_name" con el valor "Este mundo".
    Luego este string se asocia con el título de la aplicación con la propiedad label en el archivo AndroidManifest.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.tutorialesprogramacionya.proyecto047">
    
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
            <activity android:name=".MainActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    
    </manifest>
    

    Desde el Editor del Android Studio cuando vemos el archivo AndroidManifest.xml nos sustituye visualmente las constantes por los valores de las constantes para ver que realmente se almacena:

    ActionBar AndroidManifest.xml

    Pero si posicionamos el mouse sobre el valor veremos que está definida una constante con la sintaxis @string/[nombre de constante]:

    ActionBar AndroidManifest.xml

    Y si hacemos clic veremos el contenido real del valor con el que se inicializa la propiedad.

    En este archivo XML ya está inicializada la propiedad label de la marca application con el valor definido en el archivo xml (como vemos acá hacemos referencia al string app_name):

            android:label="@string/app_name"
    
  2. Ahora tenemos que definir las opciones de nuestro menú desplegable, debemos crear un archivo XML con las opciones, para esto presionamos el botón derecho sobre la carpeta res y seleccionamos la opción New -> Android resource file:
    ActionBar AndroidManifest.xml
    En este diálogo indicamos el nombre del archivo a crear "menuopciones" y el tipo de recurso (Resource type) de tipo Menu:
    ActionBar AndroidManifest.xml

    Aparece ahora una herramienta que nos permite crear el menú de opciones en forma visual (Esta herramienta está disponible desde el Android Studio 2.3.x):

    ActionBar editor android studio menu

    Arrastramos Menu Item a nuestra ventana y configuramos las propiedades:

    ActionBar editor android studio menu

    Podemos ver el archivo menuopciones.xml como texto seleccionando la opción "Text" que aparece en la parte inferior:

    <?xml version="1.0" encoding="utf-8"?>
    <menu xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:android="http://schemas.android.com/apk/res/android">
    
        <item android:title="Opcion 1"
            android:id="@+id/opcion1" />
        <item android:title="Opcion 2"
            android:id="@+id/opcion2" />
        <item android:title="Opcion 3"
            android:id="@+id/opcion3" />
    </menu>
    
    

    Versiones anteriores de Android Studio requería que se escribiera directamente el xml.

  3. La funcionalidad de nuestro programa será mostrar un Toast cuando se seleccione alguno de las opciones del menú. El código java de la clase debe ser:

    package com.tutorialesprogramacionya.proyecto047;
    
    import androidx.appcompat.app.AppCompatActivity;
    
    import android.os.Bundle;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.widget.Toast;
    
    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.menuopciones, menu);
            return true;
        }
    
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            int id = item.getItemId();
            if (id==R.id.opcion1) {
                Toast.makeText(this,"Se seleccionó la primer opción",Toast.LENGTH_LONG).show();
            }
            if (id==R.id.opcion2) {
                Toast.makeText(this,"Se seleccionó la segunda opción",Toast.LENGTH_LONG).show();
            }
            if (id==R.id.opcion3) {
                Toast.makeText(this,"Se seleccionó la tercer opción", Toast.LENGTH_LONG).show();
            }
            return super.onOptionsItemSelected(item);
        }
    }
    

    Como podemos observar hemos sobreescrito los métodos onCreateOptionsMenu y onOptionsItemSelected:

        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.menuopciones, menu);
            return true;
        }
    
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            int id = item.getItemId();
            if (id==R.id.opcion1) {
                Toast.makeText(this,"Se seleccionó la primer opción",Toast.LENGTH_LONG).show();
            }
            if (id==R.id.opcion2) {
                Toast.makeText(this,"Se seleccionó la segunda opción",Toast.LENGTH_LONG).show();
            }
            if (id==R.id.opcion3) {
                Toast.makeText(this,"Se seleccionó la tercer opción",Toast.LENGTH_LONG).show();
            }
            return super.onOptionsItemSelected(item);
        }
    

    El método onCreateOptionsMenu lee el archivo menuopciones.xml donde definimos el menú de opciones:

Este proyecto lo puede descargar en un zip desde este enlace: proyecto047.zip

Problema:

Confeccionar el mismo problema del ActionBar con el menú de opciones pero utilizando constantes para cada opción del menú y también constantes para los tres mensajes que aparecen cuando se seleccionan cada una de las opciones.

Creemos un proyecto llamado "Proyecto048" y creemos primero el archivo strings.xml con todas las constantes necesarias de nuestro programa:

strings.xml

Es decir modificamos el valor de app_name y creamos seis constantes más, tres para las etiquetas de las opciones del menú y tres para los mensajes que deben aparecer cuando se presionen las opciones.

El archivo menuopciones ahora queda codificado así (recordemos que lo podemos hacer en forma visual):

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:title="@string/opcion_menu1"
        android:id="@+id/ocion1" />
    <item android:title="@string/opcion_menu2"
        android:id="@+id/opcion2" />
    <item android:title="@string/opcion_menu3"
        android:id="@+id/opcion3" />
</menu>

Es decir hemos inicializado cada propiedad title de los item con los nombres de las constantes que creamos en el archivo strings.xml.

Finalmente el código fuente de la aplicación sufre los siguientes cambios para utilizar las constantes del archivo strings.xml cuando se deben mostrar los mensajes:

package com.tutorialesprogramacionya.proyecto048;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

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

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if (id==R.id.opcion1) {
            Toast.makeText(this,R.string.mensaje_1,Toast.LENGTH_LONG).show();
        }
        if (id==R.id.opcion2) {
            Toast.makeText(this,R.string.mensaje_1,Toast.LENGTH_LONG).show();
        }
        if (id==R.id.opcion3) {
            Toast.makeText(this,R.string.mensaje_1, Toast.LENGTH_LONG).show();
        }
        return super.onOptionsItemSelected(item);
    }
}

Lo nuevo aquí es ver que antes para mostrar el mensaje directamente en el código Java hacíamos:

        if (id==R.id.opcion1) {
            Toast.makeText(this,"Se seleccionó la primer opción",Toast.LENGTH_LONG).show();
        }

Ahora vemos si queremos extraer el dato de la constante que se encuentra en el archivo strings.xml lo debemos hacer llamando al método getString y pasando la referencia al nombre de la constante que se encuentra en la clase R y dentro de esta en una clase interna llamada string:

        if (id==R.id.opcion1) {
            Toast.makeText(this,getString(R.string.mensaje_1),Toast.LENGTH_LONG).show();
        }

Este proyecto lo puede descargar en un zip desde este enlace: proyecto048.zip


Retornar