Hace unas semanas atrás hablábamos de como guardar las preferencias de nuestras aplicaciones Android usando la Clase SharedPrefences, en esta ocasión vamos a hacerlo de una manera un poco mas gráfica, usando preferenceScreen, esto es muy similar a crear un layout ya que se trata de un xml y que de igual manera se guarda en data/data/nombre_paquete/shared_prefs, en resumen su uso es similar a una Activity obteniendo valores con SharedPreferences.
para comenzar necesitamos una carpeta llamada xml, esta no viene por defecto en el proyecto android asi que hay que crearla bajo la altura de la carpeta res, entonces nos queda algo asi res/xml.
Dentro de esa carpeta creamos un nuevo archivo xml de tipo preference, algo asi como se muestra en la imagen.
Luego dentro de ese archivo colocamos lo siguiente
Esto como lo logramos leer, se trata de un checkbox el cual hace que se cargen las preferencias o no, dependiendo si esta marcado, luego tenemos a una lista de preferencias en donde seleccionamos el color del texto el cual ya tenemos predefinido y para terminar tenemos un edittext en donde ingresamos el tamaño del texto que vamos a mostrar.
Como se hace notar estamos haciendo uso de cadenas para algunas cosas, ademas de un arreglo para mostrar la lista de colores (aunque en realidad se tratan de dos distintos array, uno para los nombre y otro para recuperar el valor que necesitamos), a continuacion de el archivo string.xml (el que se encuentra dentro de la carpeta value)
Como podemos observar aquí se encuentran los dos arreglos que utilizamos en la lista de preferencia y ademas la cadena que utiliza dialogTitle para el edittext.
Ahora pasemos a ver algo de código, que es lo que nos interesa. Para comenzar el código necesitamos crear una nueva clase dentro del proyecto, la cual simplemente llamaremos Preferencias.java
Esta clase contendrá la información (que no es mucha) del uso de las preferencias en xml, esta clase hereda de PreferenceActivity y como toda actividad se debe incluir en el AndroidManifest.xml (del minuto 5:40 a 6:01). El código es el siguiente.
Lo unico que explicare de este codigo es la linea addPreferencesFromResource(R.xml.preferencias), aunque en realidad esta muy bien explicado, simplemente se trata de una forma arreglade de setContentView(); (en realidad no lo es, pero es solo una comparación), ya que tenemos la clase terminada, pasamos a editar la clase principal de la aplicación, en mi caso se llama Preferenciasv2Activity.java, el código usado en ella es el siguiente:
Lo unio que explicare de este codigo son las variables y el método recupPref(), comencemos con las variables
Al igual que como habiamos hecho con el ejemplo anterior, creamos una varible (instancia u objeto, o como quieran llamarle) de SharedPreferences la cual se llama misPref, esto nos ayudara para obtener los valores que contenga el archivo com.nayosx.prefv2_preferences.xml (este archivo se encuentra dentro de data/data/nombre_paquete/shared_prefs), y nos servirá para asignarle valores a las demás variables que utilizamos en nuestra aplicación.
Las siguientes variables están algo claras, tamanoTexto para asignar el tamaño, colorTexto para recuperar un indice del arreglo que contiene los colores, el array listColores para asignar el color del texto, el booleano llamado guardado es para verificar que se haya generado el cheque en la otra actividad y para terminar el StringBuilder que se llama texto, para guardar todo el texto del archivo leído. Ahora revisemos el método recupPref().
Como veran el metodo es muy simple, primero asigna el valor obtenido de misPref.getBoolean("carga_pref", false) a la variable booleana guardado y de ahi parte el if, preguntando si es verdadera la variable, si es verdadera asigna a letra (que es una variable interna de tipo String ) el tamaño de la letra, de igual forma hace con el color, para luego agregarselo a las variables locales colorTexto y tamanoTexto, al final simplemente mandan estos valores a el textView llamado mostrar. En caso de que guardado sea falsa, simplemente asigna un tamaño predefinido, un color blanco y lo muestra de tal forma que nunca surgen efecto hasta que en la otra Activity se haya hecho clic en el checkbox.
Este método se ejecuta dentro de los métodos inicializar() y dentro de onRestart(), esto se hace para ver los cambios rápidamente. El método leerTexto() lo habíamos visto con anterioridad, así que no explicare como funciona.
Bueno si quieren una mejor comprensión de como funciona preferences.xml hagan clic aqui, en donde tendrán un ejemplo mucho mas completo por parte de Android Developers.
El código fuente de esta aplicación lo pueden descargar de:
https://github.com/nayosx/SharedPreference-V2
para comenzar necesitamos una carpeta llamada xml, esta no viene por defecto en el proyecto android asi que hay que crearla bajo la altura de la carpeta res, entonces nos queda algo asi res/xml.
Dentro de esa carpeta creamos un nuevo archivo xml de tipo preference, algo asi como se muestra en la imagen.
Luego dentro de ese archivo colocamos lo siguiente
Esto como lo logramos leer, se trata de un checkbox el cual hace que se cargen las preferencias o no, dependiendo si esta marcado, luego tenemos a una lista de preferencias en donde seleccionamos el color del texto el cual ya tenemos predefinido y para terminar tenemos un edittext en donde ingresamos el tamaño del texto que vamos a mostrar.
Como se hace notar estamos haciendo uso de cadenas para algunas cosas, ademas de un arreglo para mostrar la lista de colores (aunque en realidad se tratan de dos distintos array, uno para los nombre y otro para recuperar el valor que necesitamos), a continuacion de el archivo string.xml (el que se encuentra dentro de la carpeta value)
Ahora pasemos a ver algo de código, que es lo que nos interesa. Para comenzar el código necesitamos crear una nueva clase dentro del proyecto, la cual simplemente llamaremos Preferencias.java
Esta clase contendrá la información (que no es mucha) del uso de las preferencias en xml, esta clase hereda de PreferenceActivity y como toda actividad se debe incluir en el AndroidManifest.xml (del minuto 5:40 a 6:01). El código es el siguiente.
package com.nayosx.prefv2; import android.os.Bundle; import android.preference.PreferenceActivity; public class Preferencias extends PreferenceActivity{ protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.preferencias); } }
Lo unico que explicare de este codigo es la linea addPreferencesFromResource(R.xml.preferencias), aunque en realidad esta muy bien explicado, simplemente se trata de una forma arreglade de setContentView(); (en realidad no lo es, pero es solo una comparación), ya que tenemos la clase terminada, pasamos a editar la clase principal de la aplicación, en mi caso se llama Preferenciasv2Activity.java, el código usado en ella es el siguiente:
package com.nayosx.prefv2; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import android.R.color; import android.app.Activity; import android.content.Intent; import android.content.SharedPreferences; import android.graphics.Color; import android.os.Bundle; import android.preference.PreferenceManager; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; public class Preferenciasv2Activity extends Activity implements OnClickListener{ /** Called when the activity is first created. */ Button bPref; TextView mostrar, textSizeActual; SharedPreferences misPref; float tamanoTexto = 0; int colorTexto = 0; int [] listColores = {Color.CYAN, Color.RED, Color.GREEN }; boolean guardado; StringBuilder texto; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); inicializar(); } private void inicializar() { texto = new StringBuilder(); bPref = (Button) findViewById(R.id.bPref); mostrar = (TextView) findViewById(R.id.mostrar); textSizeActual = (TextView) findViewById(R.id.textSizeActual); misPref = PreferenceManager.getDefaultSharedPreferences(Preferenciasv2Activity.this); recupPref(); leerTexto(); mostrar.setText(texto.toString()); textSizeActual.setText(""+tamanoTexto); bPref.setOnClickListener(this); } @Override public void onClick(View v) { // TODO Auto-generated method stub startActivity(new Intent(Preferenciasv2Activity.this, Preferencias.class)); } private void leerTexto() { // TODO Auto-generated method stub try { int id = R.raw.linux; InputStreamReader insr = new InputStreamReader(this.getResources().openRawResource(id )); BufferedReader bf = new BufferedReader(insr); String linea; while((linea = bf.readLine()) != null) { texto.append(linea); //la siguiente linea es por si son varias lineas de texto //texto.append("\n"); } insr.close(); bf.close(); } catch(IOException e) { Toast.makeText(getApplication(), "No se pudo leer el archivo deseado", Toast.LENGTH_LONG).show(); } } private void recupPref() { guardado = misPref.getBoolean("carga_pref", false); if(guardado) { String letra = misPref.getString("tamano_letras", "10"); String color = misPref.getString("colores_lista", "Color.WHITE"); colorTexto = Integer.parseInt(color); tamanoTexto = Float.parseFloat(letra); textSizeActual.setText(""+tamanoTexto); mostrar.setTextSize(tamanoTexto); mostrar.setTextColor(listColores[colorTexto]); } else { tamanoTexto = 10; colorTexto = Color.WHITE; textSizeActual.setText(""+tamanoTexto); mostrar.setTextSize(tamanoTexto); mostrar.setTextColor(colorTexto); } } @Override protected void onRestart() { // TODO Auto-generated method stub super.onRestart(); recupPref(); } }
Lo unio que explicare de este codigo son las variables y el método recupPref(), comencemos con las variables
SharedPreferences misPref; float tamanoTexto = 0; int colorTexto = 0; int [] listColores = {Color.CYAN, Color.RED, Color.GREEN }; boolean guardado; StringBuilder texto;
Al igual que como habiamos hecho con el ejemplo anterior, creamos una varible (instancia u objeto, o como quieran llamarle) de SharedPreferences la cual se llama misPref, esto nos ayudara para obtener los valores que contenga el archivo com.nayosx.prefv2_preferences.xml (este archivo se encuentra dentro de data/data/nombre_paquete/shared_prefs), y nos servirá para asignarle valores a las demás variables que utilizamos en nuestra aplicación.
private void recupPref() { guardado = misPref.getBoolean("carga_pref", false); if(guardado) { String letra = misPref.getString("tamano_letras", "10"); String color = misPref.getString("colores_lista", "Color.WHITE"); colorTexto = Integer.parseInt(color); tamanoTexto = Float.parseFloat(letra); textSizeActual.setText(""+tamanoTexto); mostrar.setTextSize(tamanoTexto); mostrar.setTextColor(listColores[colorTexto]); } else { tamanoTexto = 10; colorTexto = Color.WHITE; textSizeActual.setText(""+tamanoTexto); mostrar.setTextSize(tamanoTexto); mostrar.setTextColor(colorTexto); } }
Como veran el metodo es muy simple, primero asigna el valor obtenido de misPref.getBoolean("carga_pref", false) a la variable booleana guardado y de ahi parte el if, preguntando si es verdadera la variable, si es verdadera asigna a letra (que es una variable interna de tipo String ) el tamaño de la letra, de igual forma hace con el color, para luego agregarselo a las variables locales colorTexto y tamanoTexto, al final simplemente mandan estos valores a el textView llamado mostrar. En caso de que guardado sea falsa, simplemente asigna un tamaño predefinido, un color blanco y lo muestra de tal forma que nunca surgen efecto hasta que en la otra Activity se haya hecho clic en el checkbox.
Este método se ejecuta dentro de los métodos inicializar() y dentro de onRestart(), esto se hace para ver los cambios rápidamente. El método leerTexto() lo habíamos visto con anterioridad, así que no explicare como funciona.
Bueno si quieren una mejor comprensión de como funciona preferences.xml hagan clic aqui, en donde tendrán un ejemplo mucho mas completo por parte de Android Developers.
El código fuente de esta aplicación lo pueden descargar de:
https://github.com/nayosx/SharedPreference-V2