Bienvenidos sean a este post, hoy agregaremos una nueva opcion para nuestro juego en este caso las preferencias del usuario para permitirle configurar algunos parametros de nuestro juego, pasemos a la accion.
Abramos nuestro proyecto llamado Asteroides creado en este post, una vez dentro del editor de Android Studio, haremos click con el boton derecho sobre el recurso res y seleccionaremos New -> Android resource file como se ve en la siguiente imagen

Una vez seleccionado nos aparecera el siguiente cuadro

Aca confeccionaremos el campo File Name con el nombre preferencias, en Resource type elegiremos XML, si Root Element no cambia automaticamente deberan ingresar PreferenceScreen y el resto debe quedar como se ve, pulsen Ok para generar el nuevo archivo y quedara de la siguiente manera

Antes de comenzar a modificar nuestro nuevo archivo debemos modificar nuestro archivo strings.xml para agregar nuestros nuevos titulos para nuestro nuevo archivo, veamos el codigo actual de nuestro archivo strings.xml:
<resources>
<string name="app_name">Asteroides</string>
<string name="tituloJuego">Asteroides</string>
<string name="botonJugar">Jugar</string>
<string name="botonConf">Configurar</string>
<string name="botonAcerca">Acerca de</string>
<string name="botonSalir">Salir</string>
<string name="tituloAcerca">Acerca De...</string>
</resources>
Lo modifcaremos de la siguiente forma:
<resources>
<string name="app_name">Asteroides</string>
<string name="tituloJuego">Asteroides</string>
<string name="botonJugar">Jugar</string>
<string name="botonConf">Configurar</string>
<string name="botonAcerca">Acerca de</string>
<string name="botonSalir">Salir</string>
<string name="tituloAcerca">Acerca De...</string>
<string name="pref_musica">Reproducir Música</string>
<string name="pref_graficos">Tipo de gráficos</string>
<string name="pref_fragmentos">Número de fragmentos</string>
<string name="pref_sum_musica">Se reproduce la música de fondo</string>
<string name="pref_sum_graficos">Se escoge la representacion de los gráficos</string>
<string name="pref_sum_fragmento">En cuantos trozos se divide los asteroides</string>
</resources>
Como pueden ver agregamos tres lineas para ser utilizados como titulos para los elementos que agregaremos en nuestro archivo de preferencias y tres lineas mas para el sumario de cada uno de los elementos del archivo nuevo, preferencias.xml, procedamos a abrir este archivo para modificar su codigo, veamos el codigo actual:
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android">
</PreferenceScreen>
Ahora lo modificaremos por el siguiente codigo:
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
android:key="preferencias_principal">
<CheckBoxPreference
android:key="musica"
android:title="@string/pref_musica"
android:summary="@string/pref_sum_musica" />
<ListPreference
android:key="graficos"
android:title="@string/pref_graficos"
android:summary="@string/pref_sum_graficos"
android:entries="@array/tiposGraficos"
android:entryValues="@array/tipoGraficosValores"
android:defaultValue="1" />
<EditTextPreference
android:key="fragmentos"
android:title="@string/pref_fragmentos"
android:summary="@string/pref_sum_fragmento"
android:defaultValue="3" />
</PreferenceScreen>
Aca acabamos de crear una pantalla de preferencias con tres elementos, uno de tipo CheckBox, otro de tipo List y un ultimo de tipo EditText, si bien puede que tengamos un error en el de tipo List muy pronto lo solucionaremos y observen como utilizamos los elementos creados y almacenados en strings.xml para en caso de necesitar modificar el titulo, lo hagamos en ese archivo y no en nuestro archivo XML para poder evitar errores en la modificacion, ahora procedamos a corregir el error de nuestro archivo para ello debemos crear un nuevo recurso, para ello vamos a hacer click con el boton derecho sobre el recurso values y seleccionaremos New -> Values resource file como se ve en la siguiente imagen

Una vez seleccionado nos aparecera el siguiente cuadro

Aca completaremos el campo File Name con el valor arrays y dejaremos el resto como se ve, pulsamos Ok se cerrara el cuadro y nos generara el nuevo archivo quedando como se ve en la siguiente imagen

Ahora procederemos a modificarlo, veamos el codigo actual:
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
Ahora lo modificaremos de la siguiente manera:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="tiposGraficos">
<item>vectorial</item>
<item>bitmap</item>
<item>3D</item>
</string-array>
<string-array name="tiposGraficosValores">
<item>0</item>
<item>1</item>
<item>2</item>
</string-array>
</resources>
En este caso, tendremos dos elementos del tipo string-array el primero va a ser tiposGraficos donde asignaremos el titulo, luego en el otro asignaremos un valor el cual estara relacionado al anterior pero mas adelante veremos para que. Ahora procederemos a crear una clase para nuestro nuevo layout sobre el contenedor de las clases java haremos click con el boton derecho y seleccionaremos New -> Java class como se ve en la siguiente imagen

Una vez seleccionado aparecera el siguiente cuadro

Deberemos modificar el campo Name por Preferencias, despues dejamos el resto como se ve y pulsamos Ok, ahora se nos generara la clase nueva como se ve en la siguiente imagen

Ahora procederemos a modificarlo pero primero veamos su codigo actual:
package org.example.asteroides;
public class Preferencias {
}
Pasemos a modificarlo de la siguiente manera:
package org.example.asteroides;
import android.os.Bundle;
import android.preference.PreferenceActivity;
public class Preferencias extends PreferenceActivity {
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferencias);
}
}
Como pueden ver esta clase se encargara de mostrar todo el contenido generado por nuestro archivo XML, ahora vamos a crear el evento para lanzarlo, no debemos olvidar declararlo en el archivo AndroidManifest.xml para no tener ningun error pero antes de esto vamos a agregar una nueva linea en strings.xml para almacenar el titulo para nuestra nueva actividad, veamos el codigo actual de strings.xml:
<resources>
<string name="app_name">Asteroides</string>
<string name="tituloJuego">Asteroides</string>
<string name="botonJugar">Jugar</string>
<string name="botonConf">Configurar</string>
<string name="botonAcerca">Acerca de</string>
<string name="botonSalir">Salir</string>
<string name="tituloAcerca">Acerca De...</string>
<string name="pref_musica">Reproducir Música</string>
<string name="pref_graficos">Tipo de gráficos</string>
<string name="pref_fragmentos">Número de fragmentos</string>
<string name="pref_sum_musica">Se reproduce la música de fondo</string>
<string name="pref_sum_graficos">Se escoge la representacion de los gráficos</string>
<string name="pref_sum_fragmento">En cuantos trozos se divide los asteroides</string>
</resources>
Lo modificaremos por el siguiente codigo:
<resources>
<string name="app_name">Asteroides</string>
<string name="tituloJuego">Asteroides</string>
<string name="botonJugar">Jugar</string>
<string name="botonConf">Configurar</string>
<string name="botonAcerca">Acerca de</string>
<string name="botonSalir">Salir</string>
<string name="tituloAcerca">Acerca De...</string>
<string name="tituloPref">Preferencias</string>
<string name="pref_musica">Reproducir Música</string>
<string name="pref_graficos">Tipo de gráficos</string>
<string name="pref_fragmentos">Número de fragmentos</string>
<string name="pref_sum_musica">Se reproduce la música de fondo</string>
<string name="pref_sum_graficos">Se escoge la representacion de los gráficos</string>
<string name="pref_sum_fragmento">En cuantos trozos se divide los asteroides</string>
</resources>
En este codigo agregaremos la siguiente linea:
<string name="tituloPref">Preferencias</string>
Esta linea se encargara de generar un titulo para nuestra proxima actividad, ahora procederemos a modificare el archivo AndroidManifest.xml pero antes veamos su codigo actual:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.example.asteroides">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
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>
<activity android:name=".AcercaDe"
android:label="@string/tituloAcerca"
android:theme="@android:style/Theme.DeviceDefault.Dialog" />
</application>
</manifest>
Veamos el codigo modificado:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.example.asteroides">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
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>
<activity android:name=".AcercaDe"
android:label="@string/tituloAcerca"
android:theme="@android:style/Theme.DeviceDefault.Dialog" />
<activity android:name=".Preferencias"
android:label="@string/tituloPref" />
</application>
</manifest>
Aca podemos ver como agregamos la nueva actividad y utilizamos el elemento creado en strings.xml ahora vamos a modificar la clase MainActivity para poder crear nuestra nueva actividad, vamos a agregar el siguiente metodo en esta clase:
public void lanzarPreferencias(View view){
Intent i = new Intent(this, Preferencias.class);
startActivity(i);
}
Quedando el codigo de la clase de las siguiente manera:
package org.example.asteroides;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void lanzarAcercaDe(View view){
Intent i = new Intent(this, AcercaDe.class);
startActivity(i);
}
public void lanzarPreferencias(View view){
Intent i = new Intent(this, Preferencias.class);
startActivity(i);
}
}
Ahora solo nos resta modificar el archivo activity_main.xml para agregar el listener para el evento click, veamos el elemento al cual modificar:
<Button
android:id="@+id/botConf"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/botonConf"
android:onClick="lanzarPreferencias" />
Veamos como queda el codigo de nuestro archivo:
<?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"
android:orientation="vertical"
android:gravity="center"
android:padding="30dp"
tools:context=".MainActivity">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/tituloJuego"
android:gravity="center"
android:layout_marginBottom="20dp"
android:textSize="25sp"
/>
<Button
android:id="@+id/botJugar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/botonJugar"
/>
<Button
android:id="@+id/botConf"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/botonConf"
android:onClick="lanzarPreferencias"
/>
<Button
android:id="@+id/botAcerca"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/botonAcerca"
android:onClick="lanzarAcercaDe"
/>
<Button
android:id="@+id/botSalir"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/botonSalir"
/>
</LinearLayout>
Si nosotros verificamos esta app funcionara pero en el log del editor nos puede aparecer que la funcion esta descontinuada (deprecated) y no debe ser utilizada pero veamos como funciona atraves del siguiente video
Recuerden hacer esta misma modificacion para el activity_main.xml pero para la vista apaisada (land), es decir agregar el evento onClick para el mismo elemento, recuerden que son dos vistas distintas y si no lo agregan no podran abrirlo cuando el celular esta en una posicion distinta a retrato (portrait) tal como se ve en el siguiente video
Si lograron lo mismo que se ve en los dos videos, Felicitaciones!!! Lograron agregarle las preferencias al juego y con esto dimos otro paso hacia adelante para nuestro primer juego en Android.
En resumen, hemos visto como agregar un set de preferencias para una app de Android, como utilizarlo en ambas vistas, como se debe declarar y seguimos con las buenas practicas con el uso de strings.xml pero como este metodo ya fue descartado a partir de la API 11 hoy no es tan utilizada pero es bueno conocerla porque en caso de necesitar crear una app por debajo de la version de API 11 es la unica utilizable. Por otro lado como pueden ver, por mas que Android las deseche estas todavia mantienen compatibilidad pero es muy probable que reciban mensajes de sugerencias para no utilizarlas, en nuestro proximo post veremos como utilizar la alternativa actual para la creacion de preferencias. Espero les haya sido util, sigueme en Twitter, Facebook o Google+ para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Tambien podes donar
Es para mantenimiento del sitio, gracias!
$1.50