Sigueme en Facebook Sigueme en Twitter Sigueme en Instagram Sigueme en Youtube
JC Mouse Bolivia
Index / Android / SharedPreferences: Preferencias de Usuario

SharedPreferences: Preferencias de Usuario

Autor jc mouse martes, enero 16, 2018

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:

  • Nombre: Preferencias de Usuario
  • Plantilla: Empty Activity
  • Activity Name: MainActivity
  • Layout Name: activity_main
  • Permisos: No se requiere
  • Dependencias: Ninguna
  • SDK mínimo: Api 16: Android 4.1

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:

share android

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:

  • CheckBoxPreference. Cuadro de texto para habilitar/deshabilitar opciones, es de tipo booleano
  • EditTextPreference. Es una caja de texto que permite introducir valores por teclado
  • ListPreference. Control que muestra una lista de valores donde solo puede seleccionarse una opción
  • MultiSelectListPreference. Similar al anterior, pero este permite seleccionar más de un valor

EditTextPreference

caja texto preferencia

CheckBoxPreference

checkbox preferencia

ListPreference

lista de valores

Los arrays entries como entryValues se declaran en el archivo string.xml de la carpeta values

String XML

MultiSelectListPreference

selección multiple

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:

divisor de preferencias

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:

Preferencias de Usuario

enjoy!!!

Tags

Si te ha gustado podrías compartirlo o dejar un comentario. ¡Muchas gracias!
Autor: JC Mouse

Yo soy yo :) JC Mouse, Soy orgullosamente boliviano soy fundador y CEO de la web jc-Mouse.net uno de las pocas web en emprendimiento y tecnología en Bolivia.

Toda la información que encuentres en este sitio es y sera completamente gratis siempre, puedes copiar, descargar y re-publicar si así lo deseas en otros blogs o sitios web, solo te pido a cambio que dejes una referencia a esta web. Esto nos ayuda a crecer y seguir aportando. Bye

Enjoy! :)

También Te Podría Interesar

Generador de números aleatorios UNIX

Generador de números aleatorios UNIX

El Método Congruencial Lineal Mixto es el más utilizado en simulación en computadoras digitales y esta basado en una rel...

Crea un TextBox estilo Metro para java

Crea un TextBox estilo Metro para java

En este tutorial personalizaremos un JTextField java para darle la apariencia de un TextBox de Windows Metro. El TextBox...

Material Design: Notificaciones (Snackbar)

Material Design: Notificaciones (Snackbar)

Material Design introduce una nueva forma de mostrar notificaciones al usuario, estos son los snackbar, similares a los...

Pon a prueba tu código con Android Studio

Pon a prueba tu código con Android Studio

Realizar pruebas sobre nuestro código nos permiten comprobar su correcto funcionamiento e integración con otros módulos...

Conectar SQL Server con VB6

Conectar SQL Server con VB6

En este post, aprenderemos como conectar Visual Basic 6 con SQL Server, abrir una tabla, leer su contenido y mostrar est...

Tangram: El rompecabezas chino

Tangram: El rompecabezas chino

El Tangram es un juego chino muy antiguo, esta compuesto por 7 piezas: un paralelogramo (romboide), un cuadrado y 5 triá...

Comparte lo que sabes

Categorias

Últimas entradas

Si trabajas con redes sociales (RRSS) a continuación te muestro tres herramintas gratuitas que te ayudaran a la hora de...

Por lo general se usan transacciones a nivel base de datos y posteriormente se llaman estos a través de procedimientos a...

En este post, aprenderemos como conectar Visual Basic 6 con SQL Server, abrir una tabla, leer su contenido y mostrar est...

Lo que veremos en este post es la configuración del driver para PHP de SQL Server que ha creado Microsoft el cual permit...

Herramientas

Generador de Enlaces a Whatsapp