En este post construiremos paso a paso un SharedPreferences más conocido en español como «Preferencias de Usuario«, estas preferencias son opciones que el usuario puede cambiar a su conveniencia para personalizar la aplicación de distintas maneras, es decir, desde cambiar tipo y color de fuente hasta opciones más avanzadas como activar o desactivar módulos completos de una programa.
Paso 1: El proyecto Android
Partimos de un proyecto base de android con las siguientes características:
Paso 2: Estructura del proyecto
Crearemos una clase que llamaremos como «PreferenciaFragment«, a continuación creamos una nueva Activity con el nombre de «PreferenciaActivity«, importante, sin layout.
En la carpeta «res«, creamos una nueva carpeta llamada «xml» y dentro de ella agregamos un nuevo recursos XML (new -> XML resource file), el archivo se llamara «preferencias_de_usuario.xml«.
Finalmente, el archivo string.xml de la carpeta res>values, ya esta creado, pero lo mencionamos porque lo utilizaremos más adelante.
Debes tener algo como esto:
Paso 3: Archivo XML de preferencias
Este archivo contiene las diferentes opciones de las que dispondrá la interfaz de Preferencias de Usuario, existen 4 tipos de controles con los que podemos trabajar, estos son:
EditTextPreference
CheckBoxPreference
ListPreference
Los arrays entries como entryValues se declaran en el archivo string.xml de la carpeta values
MultiSelectListPreference
De igual forma los arrays se declaran en el archivo string.xml
Es posible también dividir las preferencias de usuario por categorías, para ello se utiliza la etiqueta PreferenceCategory, es decir:
Dicho esto, abrimos el archivo string.xml y reemplazamos con el siguiente código:
<resources> <string name="app_name">Preferencias de Usuario</string> <!-- ListPreference: entries --> <string-array name="pref_color_texto"> <item>default</item> <item>Rojo</item> <item>Amarillo</item> <item>Verde</item> </string-array> <!-- ListPreference: entryValues --> <string-array name="pref_color_texto_valores"> <item>#000000</item> <item>#ff0000</item> <item>#fbff00</item> <item>#00c70a</item> </string-array> <!-- MultiSelectListPreference: entry --> <string-array name="pref_libros"> <item>El Principito</item> <item>El Señor de los Anillos</item> <item>Juego de Tronos</item> </string-array> <!-- MultiSelectListPreference: entryValues --> <string-array name="pref_libros_autores"> <item>El Principito de Antoine de Saint-Exupéry</item> <item>EL señor de los anilos de J. R. R. Tolkien</item> <item>Juego de Tronos George R. R. Martin</item> </string-array> <!-- MultiSelectListPreference: entryValues --> <string-array name="defaultValue"> <!-- sin valores por default --> </string-array> </resources>
A continuación, pegamos el siguiente código en el archivo preferencias_de_usuario.xml de la carpeta XML
<?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" > <PreferenceCategory android:title="General" > <EditTextPreference android:title="Texto de Bienvenida" android:defaultValue="Hola Mundo!!!" android:summary="Texto que se muestra al inicio de la aplicación" android:key="prefTexto"/> <CheckBoxPreference android:defaultValue="false" android:key="prefNegrilla" android:summary="Estilo del texto" android:title="Texto en Negrilla"/> <ListPreference android:key="prefColorTexto" android:title="Color de texto" android:defaultValue="#1e1e1e" android:entries="@array/pref_color_texto" android:entryValues="@array/pref_color_texto_valores" android:summary="Para destacar el texto" /> </PreferenceCategory> <PreferenceCategory android:title="Mis libros favoritos" > <MultiSelectListPreference android:dialogTitle="Mis Libros" android:key="pref_mis_libros" android:summary="Libros y autores favoritos" android:title="Mis Libros" android:entries="@array/pref_libros" android:entryValues="@array/pref_libros_autores" android:defaultValue="@array/pref_libros_default"/> </PreferenceCategory> </PreferenceScreen>
Paso 4: PreferenciaFragment
Esta clase que se extiende de PreferenceFragment nos permite cargar el archivo xml de preferencias declarado en el paso 3
package org.example.preferenciasdeusuario; import android.os.Bundle; import android.preference.PreferenceFragment; public class PreferenciaFragment extends PreferenceFragment { @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); // Recurso XML addPreferencesFromResource(R.xml.preferencias_de_usuario); } }
Paso 5: PreferenciaActivity
Esta clase no permite cargar en una actividad el fragmento anterior
package org.example.preferenciasdeusuario; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; public class PreferenciaActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getFragmentManager().beginTransaction() .replace(android.R.id.content, new PreferenciaFragment()) .commit(); }//onCreate:end }//PreferenciaActivity:end
Paso 6: Cargar Preferencias de Usuario y llamar a la actividad Preferencias
La interfaz consiste en un botón (button) para llamar a las preferencias de Usuario y un TextView para aplicar los cambios en las preferencias, el código XML es:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:orientation="vertical" tools:context="org.example.preferenciasdeusuario.MainActivity"> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Preferencias de Usuario" android:id="@+id/button"/> <TextView android:id="@+id/textview" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="24sp" android:text="Hello World!" /> </LinearLayout>
Finalmente, modificamos el archivo MainActivity de la siguiente manera:
package org.example.preferenciasdeusuario; import android.content.Intent; import android.content.SharedPreferences; import android.graphics.Color; import android.graphics.Typeface; import android.preference.PreferenceManager; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.TextView; import java.util.Set; public class MainActivity extends AppCompatActivity { private Button button; private TextView textview; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //Controles button = ((Button)findViewById(R.id.button)); textview = (TextView) findViewById(R.id.textview); //Evento para llavar a la actividad Preferencias de Usuario button.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { Intent i = new Intent(MainActivity.this, PreferenciaActivity.class); startActivityForResult(i, 1); } }); //Carga las preferencias de usuario preferencias(); }//onCreate:end /** * Obtiene el resultado de los cmabios realizados en la actividad Prferencias de Usuario * */ @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if(requestCode==1) { preferencias(); } } /** * Lee las preferencias de usuario y realiza los cambios segun corresponda el caso * */ private void preferencias(){ SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); //donde // getString(Valor guardado, valor por defecto) //Texto textview.setText(sharedPreferences.getString("prefTexto", "Hola Mundo!!!")); //color textview.setTextColor(Color.parseColor(sharedPreferences.getString("prefColorTexto", "#000000"))); //estilo textview.setTypeface(null, sharedPreferences.getBoolean("prefNegrilla", false) ? Typeface.BOLD : Typeface.NORMAL); //Seleccion multiple -> Mis libros favoritos Set<String> pref_libros = sharedPreferences.getStringSet("pref_mis_libros", null); if(pref_libros!=null && !pref_libros.isEmpty()){ StringBuilder stringBuilder = new StringBuilder(sharedPreferences.getString("prefTexto", "Hola Mundo!!!")); stringBuilder.append("\nLibros favoritos:"); for(String libro : pref_libros){ stringBuilder.append("\n - " + libro); } textview.setText(stringBuilder); } } }
Ejecutamos y tenemos:
enjoy!!!
Continuación del tutorial [Personalizar JTabbedPane con Netbeans]. La clase BlackTabbedPaneUI que extendemos de BasicTab[...]
Modelo Vista Controlador (MVC) es un patrón de arquitectura de software que separa los datos de una aplicación, la inter[...]
GraphADT es una proyecto alojado en github escrito en java que te permite trabajar con grafos, a la fecha de escribir es[...]
El gráfico de columnas es uno tipo de gráfico que nos permite representar fácilmente la cantidad de veces que ocurre un[...]
Cuando tenemos dominio web pero aun no tenemos el contenido listo es común colocar en su lugar una simple web de aviso q[...]
Basic 4 Android es un IDE (Entorno de Desarrollo Integrado) para Android basado en Basic (no es Visual Basic, pero se pa[...]