Ir al contenido principal

Usando SharedPreferences V2 en Android

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.

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.





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().


 

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

Entradas populares de este blog

Northwind para Mysql y otras

Supongamos que necesitamos una base de datos para comenzar a hacer pruebas y a la vez necesitamos que esa base de datos contenga mucha información con la cual trabajar. En mis tiempos de universidad existía una base de datos que utilizábamos en los laboratorios con SQL Server y c# para mostrar los datos en algún formulario. El nombre era Northwind. El problema es que era solo para SQL Server, pero alguien en se dio a la tarea de exportar esa base de datos a MySql y es justo lo que te vengo a mostrar acá. Hace un tiempo atrás clone de los repositorios de Google Code   esa información (que como algunos de ustedes sabrá dejara de estar al servicio de todos en un tiempo). Modifique un poco la DB de Mysql para que se pudiera ejecutar el script sin ningún problema. Lo interesante de todo esto es que puedes utilizar los demás script para diferentes gestores de base de datos Se advierte que para poder usarlas adecuadamente hay que modificar los campos de tipo longblob y qu...

How to upload File from form data POST in Android with Retrofit 2

 The last day I explain how to upload a simple CSV file using node . And now I teach how to upload from android device. Get source code here:  GitHub This article is write in java... later I'll add the method for kotlin. The logic is not changed, only the format code. 1) Is necessary add the dependencies in gradle: module implementation 'com.google.code.gson:gson:2.8.6' // RETROFIT // implementation 'com.squareup.retrofit2:retrofit:2.6.2' implementation 'com.squareup.retrofit2:converter-gson:2.6.2' implementation 'com.squareup.retrofit2:converter-scalars:2.5.0' 2) Add permissions in AndroidManifest.xml and modified the application for work with network security policy <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> in applitacion add ...

Como encriptar AES con Node JS

  Puedes descargar el proyecto desde este enlace El otro día surgió una necesidad para encriptar contenido bajo el algoritmo AES y es la que te vengo a mostrar a continuación en la cual use Node para solventar mi necesidad. Pude haber usando cualquier lenguaje que me viniera en gana pero no quería instalar nada mas. Dependencias: NodeJS >= 12 Crypto-JS Aplicaciones recomendadas: Git bash Visual Studio Code Lo primero que necesitamos es tener una clave única (KEY) y un vector de inicialización (IV). Este ultimo no es necesario pero agrega un extra de seguridad a nuestro contenido. Para lo cual usaremos el bash de git para utilizar openssl KEY openssl rand -base64 24 IV openssl rand -base64 12 Ahora que ya tenemos estas 2 cadenas únicas. Podemos proceder a escribir nuestro código. npm init -y Luego hacemos una modificación en el package.json para que admita módulos "type": "module", Instalamos la dependencia de Crypto-JS npm i crypto-js --save Ahora importamos l...