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

BootChess – Ajedrez en 487 bytes

BootChess – Ajedrez en 487 bytes

Desde que se crearon los videojuegos para computadora, el espacio de almacenamiento y memoria han sido siempre un proble...

Control de versiones con GIT y Netbeans

Control de versiones con GIT y Netbeans

Control de versiones: Se llama control de versiones a la gestión de los diversos cambios que se realizan sobre los eleme...

Determinante de una matriz NxN en javascript

Determinante de una matriz NxN en javascript

Notación matemática formada por una tabla cuadrada de números, u otros elementos, entre dos líneas verticales; el valor...

Minimizar aplicación al SystemTray/Bandeja del Sistema

Minimizar aplicación al SystemTray/Bandeja del Sistema

El SystemTray/Bandeja del Sistema o como también se le llama “Área de Notificación” es la sección de la barr...

Cargar fuente TTF

Cargar fuente TTF

Necesitamos: Android Studio 2 tipos de fuente TTF Agregar Archivo de fuente al proyecto Paso 1: Crear carpeta assets Cli...

Ejecutar función de postgreSQL desde Java

Ejecutar función de postgreSQL desde Java

Este es una continuación de un tutorial pasado [Funciones en PostgreSQL y pgAdmin], así que si quieres entenderlo mucho...

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*

Comparte lo que sabes

Categorias

Últimas entradas

MAUS es una aplicación para dispositivos móviles con el Sistema Operativo Android que te permite realizar exámenes desde...

En este post crearemos una aplicación en Android Studio para conectarnos con nuestra base de datos de Firebase y leer al...

Firebase es la plataforma para el desarrollo de aplicaciones web y aplicaciones móviles de Google el cual se centra en e...

Si bien se puede hacer uso de archivos de imagen (jpg, png, bmp, etc) en las aplicaciones java, también este te permite...

Android Bolivia

Bandera en Alto