miércoles, 30 de enero de 2013

ANDROID: GUARDANDO PREFERENCIAS


La celebérrima aplicacion holamundo suele saludar al mundo anglosajón con un

Hello, world!

y al mundo hispano parlante con un

¡Hola, mundo!

Pero esa aplicación ya la genera automáticamente el entorno de desarrollo Eclipse cuando empezamos una nueva aplicación para Android.

Es un saludo muy cariñoso que, además, puede ser generalizado mediante una preferencia guardada en el directorio protegido de la aplicación, en la memoria del teléfono, de una manera muy sencilla. Tras dibujar la disposición gráfica que genera un TextView llamado rotulo en medio de la pantalla, se llama a una función  que se encargará de todo:


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
saludarsegunpreferencias();
}


1.- Esa función, saludarsegunpreferencias(), obtiene una instancia al objeto PreferenciasCompartidas mediante la llamada:

SharedPreferences pref=PreferenceManager.getDefaultSharedPreferences(this);

2.- Usando ese objeto se puede obtener una cadena de caracteres llamando a la función getString(nombreCadena, valorPorDefecto), así:

String objetoasaludar=pref.getString("destinodelsaludo", "mundo");

3.- Así ya podemos saludar según las preferencias almacenadas o, en su defecto, usar el valorPorDefecto:


TextView rotulo=(TextView) findViewById(R.id.rotulo);
rotulo.setText("¡Hola, "+objetoasaludar+"!");


4.- Al pulsar en el menú Preferencias se debe lanzar la ejecución de la actividad que guardará las preferencias.


@Override
    public boolean onOptionsItemSelected(MenuItem item)
{
        switch (item.getItemId())
        {
        case R.id.menu_settings:
            Intent intento = new Intent(this, PreferenciasActivity.class);
                startActivityForResult(intento,0);
                break;        }
        return true;
    }

5.- La actividad que guarda las preferencias queda tan sencilla como:

public class PreferenciasActivity extends PreferenceActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        addPreferencesFromResource(R.xml.preferencias);
    }
}

que requiere un fichero llamado preferencias.xml en la ruta relativa del proyecto /res/xml/preferencias.xml
Este archivo contiene la especificación gráfica de las preferencias:

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
    <EditTextPreference android:dialogTitle="¿A QUIEN SALUDO?" android:title="¿A QUIEN SALUDO?" android:summary="Escribe a quén tiene que ir dirigido el saludo" android:key="destinodelsaludo"/>

</PreferenceScreen>

y genera ese aspecto visual común a todas las típicas pantallas de configuración de las aplicaciones de Android



OPTIMIZACIÓN NÚMERO 1:

Lo que ocurre es que, tal y como está escrito este código, al aceptar y pulsar el botón Atrás, volvemos a la actividad principal, donde sigue mostrándose el saludo antiguo. El saludo nuevo solo se muestra si cerramos y volvemos a abrir la aplicación.
Para que se repinte el saludo con las preferencias de configuración actuales, hay que añadir el siguiente código a la clase principal:


    @Override
    protected void onResume()
    {
        super.onResume();
        saludarsegunpreferencias();
    }

OPTIMIZACIÓN NÚMERO 2: (...y la más importante)

Como hemos llegado a la "aparente" ejecución correcta a base de sucesivas mejoras (bueno, en este caso, una mejora) hemos cometido el error de ejecutar dos veces el código saludarsegunpreferencias() al arrancar por primera vez la aplicación:

  1. La primera vez llamándolo desde el método onCreate
  2. La segunda vez llamándolo desde el método onResume
Así que el código siguiente es erróneo:



@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
                saludarsegunpreferencias();
}

@Override
    protected void onResume()
    {
        super.onResume();
        saludarsegunpreferencias();
    }




y debería anularse la llamada en el método onCreate, quedando correctamente así:


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}

@Override
    protected void onResume()
    {
        super.onResume();
        saludarsegunpreferencias();
    }



No hay comentarios:

Publicar un comentario