Android - cómo cambiar ícono y título de la app

Objetivo

Por defecto cuando creamos desde cero una actividad en blanco (Blank Activity) con el Android Studio, nos genera la página con una toolbar que muestra el label de la aplicación.

Android - Main Activity

Vista Default

La actividad principal define una toolbar

<android.support.design.widget.AppBarLayout
  android:id="@+id/app_bar"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:theme="@style/AppTheme.AppBarOverlay">

  <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <android.support.v7.widget.Toolbar
      android:id="@+id/toolbar"

El id/toolbar se asigna en el método onCreate() al heredar de AppCompatActivity:

override fun onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState)
  setContentView(R.layout.activity_pelicula_app_bar)

  val toolbar = findViewById(R.id.toolbar) as Toolbar
  setSupportActionBar(toolbar)

En nuestro AndroidManifest.xml definimos el label de la aplicación, mediante una indirección a una constante:

<activity
  android:name=".ConversorActivity"
  android:label="@string/app_name"
  >

Esa constante entonces, debemos verla en el archivo res/values/strings.xml:

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

Cambiando el título

Primero lo más sencillo: cambiaremos el nombre de la aplicación.

<resources>
  <string name="app_name">Conversor de medidas</string>

Otra opción es definir una nueva constante y apuntar la propiedad android:label de la activity principal de nuestra aplicación hacia esta constante, en todo caso dejamos esta tarea al lector.

Agregando un ícono a nuestra aplicación

Si además queremos visualizar un ícono en la toolbar, debemos modificar el layout default

Encontrar un ícono

La imagen debe tener un ícono, hay algunas opciones

Vamos por la segunda opción, ingresamos a esta página y seleccionamos , por ejemplo, esta URL: cambiamos el color de fondo y al hacer Download zip vemos que tenemos el mismo png con diferentes tamaños en directorios especiales, uno para cada tipo de resolución:

Copiamos entonces el directorio res a nuestra aplicación:

  1. abrimos el zip
  2. extract …
  3. … al directorio donde está la aplicación

Ahora sí generamos la ImageView y el TextView (activity_conversor.xml):

<android.support.v7.widget.Toolbar
  android:layout_width="match_parent"
  android:layout_height="?attr/actionBarSize"
  android:background="?attr/colorPrimary"
  app:popupTheme="@style/AppTheme.PopupOverlay">
<ImageView 
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:src="@drawable/ic_action" />
<TextView
  android:id="@+id/toolbar"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content" />
</android.support.v7.widget.Toolbar>

Hicimos un pequeño cambio: el id/toolbar se lo asignamos al TextView en lugar de a la toolbar.

Ejecutamos la aplicación y nos aparece un mensaje de error en el LogCat:

11-10 15:21:52.540 8720-8720/? E/AndroidRuntime:  Caused by: java.lang.ClassCastException: android.support.v7.widget.AppCompatTextView cannot be cast to android.support.v7.widget.Toolbar
11-10 15:21:52.540 8720-8720/? E/AndroidRuntime:     at org.uqbar.conversor.ConversorActivity.onCreate(ConversorActivity.java:23)

Ajustamos entonces el método onCreate, para asignar manualmente el valor del textview (ConversorActivity.java):

override fun onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState)
  setContentView(R.layout.activity_pelicula_app_bar)

  val toolbar = findViewById(R.id.toolbar) as Toolbar
  setSupportActionBar(toolbar)
  toolbar.text = R.string.app_name

Ahora sí, se visualiza el ícono y el título:

Android New Title & Icon

Pero sería bueno que resaltara un poco más el título, para eso configuramos la propiedad textSize:

<TextView
  android:id="@+id/toolbar"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:textAppearance="?
  android:attr/textAppearanceLarge"/>

Resultado final

Y vemos reflejado el cambio en la aplicación

Android Resultado Final