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

Tutorial HeidiSQL: Sesion, Base de datos y Tablas

Tutorial HeidiSQL: Sesion, Base de datos y Tablas

HeidiSQL es un software libre y de código abierto que permite conectarse a servidores MySQL, MariaDB, Percona Server, Mi...

Reportes con imagenes en Java (Video)

Reportes con imagenes en Java (Video)

Video Tutorial que muestra una de las maneras de utilizar y mostrar imagenes en iReport, pasando estas como parametros d...

Uso de Arrays: Ejemplo práctico

Uso de Arrays: Ejemplo práctico

En este post iremos conociendo de un modo práctico que es y como se utiliza un Array en java, para esto partiremos de un...

Capturar webcam con VB.NET

Capturar webcam con VB.NET

¿Que haremos? Crearemos una aplicación en Visual Studio, la cual hará uso de una webcam para capturar el video en frames...

Microservicio REST Java con Spark – Parte 1

Microservicio REST Java con Spark – Parte 1

En este y un segundo post desarrollaremos un microservicio java utilizando el framework Spark que implementara las funci...

Laberinto del Terror (Código Fuente + juego)

Laberinto del Terror (Código Fuente + juego)

El laberinto del terror es un juego en el que haciendo uso del ratón y de tu pulso de borracho debes cruzar distintos la...

Comparte lo que sabes

Categorias

Últimas entradas

Blockly proyecto de Google for Education, es una biblioteca en JavaScript que agrega un editor de código visual a aplica...

j2html es una biblioteca para java que permite generar código html seguro desde código java utilizando sus propias etiqu...

En este post haremos uso de PanoramaImageView para agregar a una aplicación android, una vista panorámica de 180° y 360°...

¿Que es una infografia? “Una infografía es una representación visual informativa o diagrama de textos escritos que...

Android Bolivia

MAUS