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
¿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.
El codigo anterior recupera la informacion de las preferencias, pero no las guarda, para ello hacemos lo siguiente, dentro del metodo onDestroy()
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
el codigo completo de la clase, para que la revisen paso a paso
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
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