Como ya se explicó en la primera parte de los menús toda actividad tiene por defecto una barra superior donde aparece el nombre y menú (si se ha creado). Esta barra recibe el nombre de Action Bar. Su funcionalidad se basa en la de mantener un marco común a la activity así como mostrar lo comentado antes. En el caso de no querer que aparezca tan solo se tendría que modificar el estilo añadiendo lo siguiente:

<resources>
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    </style>
</resources>

De esta forma hacemos que desaparezca dicha barra. Desde Material Design en adelanta (5.0) la librería de soporte ofrece una alternativa a esta Action Bar incorporando características muy interesantes. Esta alternativa recibe el nombre de toolbar

Toolbar

La Toolbar una barra superior pero que puede englobar cualquier elemento en su interior, desde botones hasta spinner, pasando por pestañas que modifiquen el contenido de la activity. Lo primero que hay que tener en cuenta para poder trabajar con una Toolbar es que la actividad tiene que tener el tema NoActionBar dentro de los estilos y que dentro del gradle está compilada la librería de soporte:

compile 'com.android.support:appcompat-v7:26.+'

Una vez cumplidos estos dos requisitos la activity no tendrá parte superior, por lo que habrá que ponérsela de forma manual mediante la Toolbar en el archivo XML

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.developandsystem.toolbarexplicacion.MainActivity">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        android:elevation="4dp"
        android:theme="@style/ThemeOverlay.AppCompat.ActionBar"
        app:popupTheme="@style/ThemeOverlay.AppCompat.Light">

    </android.support.v7.widget.Toolbar>
    
</LinearLayout>

de los atributos incluidos comentar:

  • layout_height: el tamaño en alto de la barra será como el tamaño de la Action Bar inicial. En el caso de querer un tamaño mayor o acoplado al contenido se tendría que indicar
  • background: se debe indicar el mismo color que la barra superior
  • elevation: de modo que quede algo superior al contenido de la pantalla
  • theme: los temas que se seguirán asignando a la hora de poner elementos (menús, botones, iconos, texto, etc…)

Con esta definición la barra de herramientas está preparada. Una de las características que tiene esta Toolbar es que se pueden agregar elementos directamente en la misma para luego hacerlos funcionales:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.developandsystem.toolbarexplicacion.MainActivity">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        android:elevation="4dp"
        android:theme="@style/ThemeOverlay.AppCompat.ActionBar"
        app:popupTheme="@style/ThemeOverlay.AppCompat.Light">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Texto de pruea"
            android:textColor="@android:color/white"/>

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/buttonToolbar"
            android:text="Pulsar"
            style="@style/Base.Widget.AppCompat.Button.Borderless"
            android:textColor="@android:color/white"></Button>

    </android.support.v7.widget.Toolbar>

</LinearLayout>

Una vez configurada la toolbar en la activity, queda reverenciarla y asociarla de forma completa en la activity para hacerla funcional. Para ello se utilizará el método setSupportActionBar

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    tb = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(tb);   
}

Así la toolbar queda funcional en la activity y se podrán utilizar los métodos siempre antes llamando al método getSupportActionBar()

getSupportActionBar().setTitle("Nombre de la activity");
getSupportActionBar().setIcon(android.R.drawable.btn_star_big_on);
getSupportActionBar().setHomeAsUpIndicator(android.R.drawable.ic_menu_manage);

Para poder poner un menú en la toolbar se debe sobreescribir el mismo método que se explico con anterioridad en la entrada de menús:

@Override
public boolean onCreateOptionsMenu(Menu menu) {

    getMenuInflater().inflate(R.menu.menu_toolbar,menu);
    return true;
}

Manejo eventos

Para poder manejar la pulsación de alguno de los elementos del menú se asocia un listener directamente a la toolbar mediante el método setOnMenuItemClickListener()

tb = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(tb);
getSupportActionBar().setTitle("Nombre de la activity");
tb.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
    @Override
    public boolean onMenuItemClick(MenuItem item) {
        switch (item.getItemId()){
            case R.id.elemento1:
                Log.v("test","pulsado elemento 1");
                break;
            case R.id.elemento2:
                Log.v("test","pulsado elemento 2");
                break;
        }
        return true;
    }
});

O bien directamente con el método anteriormente explicado

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()){
        case R.id.elemento1:
            Log.v("test","pulsado elemento 1");
            break;
        case R.id.elemento2:
            Log.v("test","pulsado elemento 2");
            break;
        case android.R.id.home:
            Log.v("test","elemento pulsado");
    }

    return true;
}

Si se define un botón home, se utiliza el método

barraToolbar.setNavigationIcon(android.R.drawable.btn_star);

Para evaluar la pulsación de este elemento se utiliza el elemento android.R.id.home

case android.R.id.home:
    Log.v("test","elemento pulsado");

En el caso de tener un elemento definido dentro del Toolbar, habrá que reverenciarlo y usarlo de forma normal en la activity

bToolbar = (Button) findViewById(R.id.botonToolbar);
bToolbar.setOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View view) {
      Log.v("test","boton pulsado");
   }
});