2010-09-30 17 views
22

Nuevo en Android, tengo un código cuando el usuario cambia una preferencia. Actualizo el campo Resumen en la preferencia de UI para que sea el valor que ingresaron. Sin embargo, cuando se crea la actividad de preferencia, me gustaría configurar los campos de Resumen para que sean los valores en las preferencias correspondientes. por favor asesorar. Gracias.Configuración del campo Resumen de preferencia de UI al valor de la preferencia

public class MyPreferenceActivity extends PreferenceActivity implements 
     OnSharedPreferenceChangeListener { 

    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     addPreferencesFromResource(R.xml.preference); 
     SharedPreferences sp = getPreferenceScreen().getSharedPreferences(); 
     sp.registerOnSharedPreferenceChangeListener(this); 
    } 

    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, 
      String key) { 
     Preference pref = findPreference(key); 
     if (pref instanceof EditTextPreference) { 
      EditTextPreference etp = (EditTextPreference) pref; 
      pref.setSummary(etp.getText()); 
     } 
    } 
} 
+1

posible duplicado de [¿Cómo se muestra el valor actual de una Preferencia de Android en el resumen de Preferencias?] (Http://stackoverflow.com/questions/531427/how-do-i-display-the-current -value-of-an-android-preference-in-the-preference-su) –

Respuesta

45

Soy nuevo también, así que puede que no sea el mejor código, pero esto es similar a lo que estoy haciendo. Es probable que desee registrar su oyente en Reanudar y anular el registro en Pausa en lugar de en Crear. Espero que esto ayude.

Principalmente solo necesita tomar el pref, el valor de pref y establecer el resumen.

public class MyPreferenceActivity extends PreferenceActivity implements 
     OnSharedPreferenceChangeListener { 

    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     addPreferencesFromResource(R.xml.preference); 
     SharedPreferences sp = getPreferenceScreen().getSharedPreferences(); 
     EditTextPreference editTextPref = (EditTextPreference) findPreference("thePrefKey"); 
     editTextPref 
       .setSummary(sp.getString("thePrefKey", "Some Default Text")); 
    } 

    protected void onResume() { 
     super.onResume(); 
     getPreferenceScreen().getSharedPreferences() 
       .registerOnSharedPreferenceChangeListener(this); 
    } 

    protected void onPause() { 
     super.onPause(); 
     getPreferenceScreen().getSharedPreferences() 
       .unregisterOnSharedPreferenceChangeListener(this); 
    } 

    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, 
      String key) { 
     Preference pref = findPreference(key); 
     if (pref instanceof EditTextPreference) { 
      EditTextPreference etp = (EditTextPreference) pref; 
      pref.setSummary(etp.getText()); 
     } 
    } 
} 
+0

diddnt trabajo para mí. el texto de resumen no cambia – jonney

+0

Me funciona. Solo se dispara cuando se cambia el valor. Por lo tanto, debe preestablecer el resumen en Creado si su configuración ya contiene valor. SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences (this); String email = sharedPreferences.getString ("prefUsername", "NULL"); EditTextPreference prefUsername = (EditTextPreference) findPreference ("prefUsername"); prefUsername.setSummary (correo electrónico); – yancyn

+0

Pregunta: ¿por qué esta respuesta (y la pregunta original) se envió a 'EditTextPreference'? 'setSummary' es un método de' Preference'. ¿Hay alguna razón específica para lanzar? Solo estoy tratando de entender. –

7

Esto funcionó para mí.

public class PrefsActivity extends PreferenceActivity implements OnSharedPreferenceChangeListener 
{ 
    private Preference pref; 
    private String summaryStr; 
    String prefixStr; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     addPreferencesFromResource(R.xml.prefs); 

     SharedPreferences sharedPref = getPreferenceScreen().getSharedPreferences(); 
     sharedPref.registerOnSharedPreferenceChangeListener(this);  
    } 

    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) 
    { 
     //Get the current summary 
     pref = findPreference(key); 
     summaryStr = (String)pref.getSummary(); 

     //Get the user input data 
     prefixStr = sharedPreferences.getString(key, ""); 

     //Update the summary with user input data 
     pref.setSummary(summaryStr.concat(": [").concat(prefixStr).concat("]")); 
    } 
} 
1

Lo que suelo hacer es:
1 - Hacer una nueva clase que extiende el tipo de preferencia que necesito para mostrar (1 según el tipo de preferencia) 2 - Dentro de su código, haga lo actiob apropiado para mostrar el resumen actualizado
3 - Consulte esta clase en el res/xml/preferences.xml archivo

Let me swo un pequeño ejemplo, para una buena EditTextPreference:

CLS_Prefs_Edit.java

/** 
* CLS_Prefs_Edit class 
* 
* This is the class that allows for a custom EditTextPrefence 
* (auto refresh summary). 
* 
* @category Custom Preference 
* @author  Luca Crisi ([email protected]) 
* @copyright Luca Crisi 
* @version  1.0 
*/ 
package com.your_name.your_app; 

/* -------------------------------- Imports --------------------------------- */ 

import android.content.Context; 
import android.preference.EditTextPreference; 
import android.util.AttributeSet; 

public final class CLS_Prefs_Edit 
extends EditTextPreference 
{ 

    /* ---------------------------- Constructors ---------------------------- */ 

    public CLS_Prefs_Edit(final Context ctx, final AttributeSet attrs) 
    { 
     super(ctx, attrs); 
    } 
    public CLS_Prefs_Edit(final Context ctx) 
    { 
     super(ctx); 
    } 

    /* ----------------------------- Overrides ------------------------------ */ 

    @Override 
    public void setText(final String value) 
    { 
     super.setText(value); 
     setSummary(getText()); 
    } 
} 

res/xml/preferences.xml

<?xml version="1.0" encoding="utf-8"?> 
<PreferenceScreen 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    > 
    <PreferenceCategory android:title="@string/pref_phone_cat"> 
<!-- NORMAL EditTextPreference, NO summary update --> 
<!--   <EditTextPreference --> 
<!--    android:widgetLayout="@layout/arr_dn" --> 
<!--    android:key="phone" --> 
<!--    android:title="@string/pref_phone_title" --> 
<!--    android:summary="@string/pref_phone_summ" --> 
<!--    android:defaultValue="" --> 
<!--    android:inputType="phone" --> 
<!--    android:digits="+1234567890" --> 
<!--   /> --> 
<!-- MY EditTextPreference, WITH summary update --> 
     <com.your_name.your_app.CLS_Prefs_Edit 
      android:widgetLayout="@layout/arr_dn" 
      android:key="phone" 
      android:title="@string/pref_phone_title" 
      android:summary="@string/pref_phone_summ" 
      android:defaultValue="" 
      android:inputType="phone" 
      android:digits="+1234567890" 
     /> 
    </PreferenceCategory> 
</PreferenceScreen> 

Por supuesto, establecer sus cadenas en/res/valores/cuerdas, y ya está.

Tenga en cuenta que esta solución funciona tanto para PreferenceFragments como para PreferenceActivities.
Lo estoy usando para una aplicación que se ejecuta en 2.2 Froyo (que muestra una actividad de preferencia), así como en 4.4 KitKat (que muestra un PreferenceFragment)

Espero que ayude.

+0

Mientras esto funciona, eso introducirá una mala dependencia entre las llamadas setText() y setSummary(). Por ejemplo, el marco de android puede decidir llamar a setSummary() con una cadena vacía (para aplicar el valor de xml) después de llamar a setText(). –

Cuestiones relacionadas