Como se describe aquí , estoy subclasificando PreferenceFragment y lo estoy mostrando dentro de una Activity. Ese documento explica cómo escuchar los cambios de preferencias aquí , pero solo si subclasifica PreferenceActivity. Dado que no estoy haciendo eso, ¿cómo escucho los cambios de preferencias?
Intenté implementar OnSharedPreferenceChangeListener en mi PreferenceFragment pero parece que no funciona ( onSharedPreferenceChangedparece que nunca se llama).
Este es mi código hasta ahora:
SettingsActivity.java
public class SettingsActivity extends Activity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
// Display the fragment as the main content.
getFragmentManager().beginTransaction().replace(android.R.id.content, new SettingsFragment()).commit();
}
}
SettingsFragment.java
public class SettingsFragment extends PreferenceFragment implements OnSharedPreferenceChangeListener
{
public static final String KEY_PREF_EXERCISES = "pref_number_of_exercises";
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
// Load the preferences from an XML resource
addPreferencesFromResource(R.xml.preferences);
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key)
{
//IT NEVER GETS IN HERE!
if (key.equals(KEY_PREF_EXERCISES))
{
// Set summary to be the user-description for the selected value
Preference exercisesPref = findPreference(key);
exercisesPref.setSummary(sharedPreferences.getString(key, ""));
}
}
}
preferencias.xml
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
<EditTextPreference
android:defaultValue="15"
android:enabled="true"
android:key="pref_number_of_exercises"
android:numeric="integer"
android:title="Number of exercises" />
</PreferenceScreen>
Además, ¿PreferenceFragment es el lugar correcto para escuchar los cambios de preferencia o debería hacerlo dentro de la Actividad?
android
android-fragments
android-activity
sharedpreferences
android-preferences
XåpplI'-I0llwlg'I -
fuente
fuente

Respuestas:
Creo que solo necesita registrar / anular el registro
Listeneren suPreferenceFragmenty funcionará.Dependiendo de lo que desee hacer, es posible que no necesite utilizar un oyente. Los cambios en las preferencias se comprometen
SharedPreferencesautomáticamente.fuente
getPreferenceManager(como lo ha hecho) ogetPreferenceScreen? ¿Cual es la diferencia?getPreferenceManagergeneralmente es la opción preferida.keydebería ser el parámetro? No he probado esto, tienes un ejemplo de la respuesta de Gunnar a continuación:onSharedPreferenceChanged(null, ""). Puede que no sea adecuado para sus necesidades. Quizás debería iterar en sus claves de preferencias que necesitan una actualizaciónLa solución de antew funciona bien, aquí puede ver una actividad de preferencia completa para Android v11 en adelante:
fuente
Todas las demás respuestas son correctas. Pero me gusta más esta alternativa porque inmediatamente tienes la instancia de Preferencia que causó el cambio.
fuente
onSharedPreferenceChanged ()puedes acceder a la instancia de Preference fácilmente confindPreference(key). ¿Quizás laSharedPreferencesforma es la preferida debido a la cosa de registrarse / anular el registro?Esto funcionó para mí desde PreferenceFragment.onCreate ()
fuente
Aquí hay una forma de hacerlo y evitar posibles pérdidas de memoria:
fuente
Otro ejemplo completo para que veas la imagen completa.
fuente
Recientemente terminé de armar el mío
PreferenceScreenusando elPreferences API, así que pensé en contribuir con mi propio Ejemplo completo. Esto incluye actualizar elSummaryValor nuevo / cambiado, así como escuchar y reaccionar a los cambios.PD. Para responder a su última pregunta: para mostrar un valor predeterminado para
Summaryla creación inicial dePreferenceScreen(antes de cualquier cambio en el valor), simplemente puede establecer elandroid:summaryvalor de su elección, desde elpreferences.xmlarchivo directamente, y luego, una vez allí es un cambio en el Valor, se actualizará automáticamente usando el código contenido en mi Ejemplo a continuación. Personalmente , utilizo una breve explicación dePreferencecomo mi inicialSummary, Establecido dentro de mipreferences.xml, y luego una vez que el valor no se ve modificado por primera vez, simplemente se muestran el valor actual comoSummarya partir de entonces ..De todos modos , aquí está mi completa Ejemplo:
SettingsFragment.java
¡Espero que esto ayude!
Cualquier comentario positivo es muy apreciado, ya que soy bastante nuevo en StackOverflow;) ¡
Feliz codificación!
fuente
onPause, ¿sesuper.onPause()debe llamar antes o después de que se cancele el registro del oyente? ¿Hay siquiera una diferencia? He visto ambos en numerosos ejemplossuper.onPause();es probablemente la mejor manera de hacerlo.Solo necesita eliminar la clase Prefernce especificada en su
onResume()método. En mi caso, estaba usandoSwitchPreferenceclass, por lo tanto, el código sería como: SettingsActivity.classLuego, en la actividad en la que desea usar el
PrefernceFragmentvalor, simplemente use elSharedPreferenceobjeto para llamar a los valores y activarlo.fuente