Ir al contenido principal

Usando SharedPreferences Android V1

Una de las cosas mas usadas en las aplicaciones es el guardar las preferencias de estas y como se hace eso, es muy simple, haciendo uso de la clase SharedPreferences y algunas variables para guardar el contenido de estas.




Para comenzar necesitamos declarar una variable  de tipo SharedPrefernces y obtener/crear un archivo en donde guardar las preferencias

final String PREFERENCIAS = "mis_preferences";
//guarda el nombre de nuestras preferecias
SharedPreferences getPref ;

getPref = this.= this.getSharedPreferences(PREFERENCIAS, Context.MODE_PRIVATE);


¿Como funciona?, es simple al crear pref y asignarle getSharedPreferences(String arg, int arg), esto crea un archivo XML en /data/data/nombre_paquete/shared_pref/mis_preferences.xml, y dentro del método, el primer argumento es el nombre del archivo XML, el segundo es un entero (para mas info has clic aquí), el entero puede variar de la siguiente manera:

MODE_MULTI_PROCESS

MODE_PRIVATE

MODE_WORLD_READABLE

MODE_WORLD_WRITEABLE

Cada una con sus variaciones, es de aclarar que para conocerlas hay que leer la documentación de Android,  de lo contrario esto se volverá muy largo. Aquí simplemente se uso MODE_PRIVATE porque solo haremos uso de las preferencias en la aplicación, no queremos compartirla ni nada por el estilo ya que solo es un ejemplo de rutina.

¿Y ahora?

Ahora lo que tenemos que hacer dentro del método onCreate() (en este caso se hace uso de inicializar(), que se ejecuta dentro de método onCreate() ), es llamar a las variables que utilicemos ejempleo:


boolean estadoBoton, estadoR1, estadoR2;
    final String ESTBOTON="el estado del boton", ESTR1 = "radio 1", ESTR2 = "radio 2", PREFERENCIAS = "preferences";
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        inicializar();//se inicializa el metodo 

    }
    private void inicializar()
    {
     getPref = this.getSharedPreferences(PREFERENCIAS, Context.MODE_PRIVATE);
     estadoBoton = getPref.getBoolean(ESTBOTON, estadoBoton);
     estadoR1 = getPref.getBoolean(ESTR1, estadoR1);
     estadoR2 = getPref.getBoolean(ESTR2, estadoR2);
    }


El codigo anterior recupera la informacion de las preferencias, pero no las guarda, para ello hacemos lo siguiente, dentro del metodo onDestroy()


SharedPreferences.Editor prefSave;

protected void onDestroy() {
     // TODO Auto-generated method stub
     super.onDestroy();
     prefSave = getPref.edit();
     prefSave.putBoolean(ESTBOTON, estadoBoton);
     prefSave.putBoolean(ESTR1, estadoR1);
     prefSave.putBoolean(ESTR2, estadoR2);
     prefSave.commit();
    }

Lo que hace es lo siguiente, creamos una variable tipo SharedPreferences.Editor y luego le asignamos getPref.editor(),  y cada vez que queramos guardar algo hacemos uso del método putBoolean(String KEY, boolean value), cabe mencionar que hay metodos para cada tipo conocido de Variables (en especial para las de tipo primitivas), es decir hay un metodo putString(String KEY, String value), otro putInt(String KEY, int value) y asi sucesivamente, para los demas. Pero en este caso en especifico solo se uso para tipo booleano, ya que la aplicacion requeria guardar estados de botonos, checkbox etc. Para finalizar simplemente le indicamos que lo haga con commit()

Hay que conocer y tener muy en cuenta la vida o ciclo de una Activity, ya que según nuestros requerimientos, sera la forma en como se guarden las preferencias, por lo general, se utiliza a el método onStart() para obtener las preferencias y al método onDestroy() para guardarlas, pero aqui usamos onCreate() y onDestroy(), esto claro esta, porque la aplicación no hace uso ni esta en segundo plano, ya que es muy simple y no necesitamos de un service o algo por el estilo, de lo contrario deberiamos de tener en cuenta onStart(), por cualquier consulta aqui dejo la imagen de la vida o ciclo de Activity




Ya que tenemos guardados los datos de la aplicación, hay que asignarlas a los distintos componentes del layout, siempre en el método inicializar() y hacemos lo siguiente



private void inicializar()
    {
     getPref = this.getSharedPreferences(PREFERENCIAS, Context.MODE_PRIVATE);
     estadoBoton = getPref.getBoolean(ESTBOTON, estadoBoton);
     estadoR1 = getPref.getBoolean(ESTR1, estadoR1);
     estadoR2 = getPref.getBoolean(ESTR2, estadoR2);
     
     bn = (Button) findViewById(R.id.button1);
     ch = (CheckBox) findViewById(R.id.checkBox1);
     r1 = (RadioButton) findViewById(R.id.radioButton1);
     r2 = (RadioButton) findViewById(R.id.radioButton2);
     rg = (RadioGroup) findViewById(R.id.rg);
     tv = (TextView) findViewById(R.id.textView4);
     
     bn.setOnClickListener(this);
     
     ch.setOnCheckedChangeListener(this);

        ch.setChecked(estadoBoton);//se manda el estado a r1

 rg.setOnCheckedChangeListener(this);

 r1.setChecked(estadoR1);//se manda el estado al checkbox

 r2.setChecked(estadoR2); //se manda el estado al r2
     
    }





el codigo completo de la clase, para que la revisen paso a paso

package com.nayosx.pref;

import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.*;
import android.widget.RadioGroup.OnCheckedChangeListener;

public class PruebapreferenciasActivity extends Activity implements OnClickListener, RadioGroup.OnCheckedChangeListener, CheckBox.OnCheckedChangeListener{
    /** Called when the activity is first created. */
 SharedPreferences getPref ;
 SharedPreferences.Editor prefSave;
 Button bn;
 CheckBox ch;
 RadioButton r1, r2;
 RadioGroup rg;
 TextView tv;
 boolean estadoBoton, estadoR1, estadoR2;
 final String ESTBOTON="el estado del boton", ESTR1 = "radio 1", ESTR2 = "radio 2", PREFERENCIAS = "preferences";
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        inicializar();
    }
    private void inicializar()
    {
     getPref = this.getSharedPreferences(PREFERENCIAS, Context.MODE_PRIVATE);
     estadoBoton = getPref.getBoolean(ESTBOTON, estadoBoton);
     estadoR1 = getPref.getBoolean(ESTR1, estadoR1);
     estadoR2 = getPref.getBoolean(ESTR2, estadoR2);
     
     bn = (Button) findViewById(R.id.button1);
     ch = (CheckBox) findViewById(R.id.checkBox1);
     r1 = (RadioButton) findViewById(R.id.radioButton1);
     r2 = (RadioButton) findViewById(R.id.radioButton2);
     rg = (RadioGroup) findViewById(R.id.rg);
     tv = (TextView) findViewById(R.id.textView4);
     
     bn.setOnClickListener(this);
     
     ch.setOnCheckedChangeListener(this);
     ch.setChecked(estadoBoton);
     rg.setOnCheckedChangeListener(this);
     r1.setChecked(estadoR1);
     r2.setChecked(estadoR2);
     
    }
 @Override
 
    protected void onDestroy() {
     // TODO Auto-generated method stub
     super.onDestroy();
     prefSave = getPref.edit();
     prefSave.putBoolean(ESTBOTON, estadoBoton);
     prefSave.putBoolean(ESTR1, estadoR1);
     prefSave.putBoolean(ESTR2, estadoR2);
     
     prefSave.commit();
    }

    @Override
    public void onClick(View p_arg0) {
     // TODO Auto-generated method stub
     mensaje("El boton esta activado, de lo contrario no saldria este mensaje");
    }


    @Override
    public void onCheckedChanged(RadioGroup p_group, int p_checkedId) {
     // TODO Auto-generated method stub
     if(r1.isChecked())
     {
      tv.setTextColor(Color.RED);
      estadoR1 = true;
      estadoR2 = false;
     }
     else if(r2.isChecked())
     {
      tv.setTextColor(Color.GREEN);
      estadoR1 = false;
      estadoR2 = true;
     }
    }


    private void mensaje(String p_string) {
     // TODO Auto-generated method stub
     Toast.makeText(getApplicationContext(), p_string, Toast.LENGTH_SHORT).show();
    }


    @Override
    public void onCheckedChanged(CompoundButton p_buttonView, boolean p_isChecked) {
     // TODO Auto-generated method stub
     if(p_isChecked)
     {
      estadoBoton = true;
      bn.setEnabled(estadoBoton);
      ch.setText("Boton Activado");
     }
     else
     {
      estadoBoton = false;
      bn.setEnabled(estadoBoton);
      ch.setText("Boton Desactivado");
     }
    }
    
}

para descargar la aplicacion completa has clic aquí, cualquier duda no vaciles y preguntame, yo intentare responderte lo mas pronto posible.

Para mayor referencia, que mejor que la propia documentación de Android

SharedPreferences (ejemplo de Google)

Clase SharedPreferences y sus metodos

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