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 ( onSharedPreferenceChanged
parece 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
Listener
en suPreferenceFragment
y funcionará.Dependiendo de lo que desee hacer, es posible que no necesite utilizar un oyente. Los cambios en las preferencias se comprometen
SharedPreferences
automáticamente.fuente
getPreferenceManager
(como lo ha hecho) ogetPreferenceScreen
? ¿Cual es la diferencia?getPreferenceManager
generalmente es la opción preferida.key
deberí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 laSharedPreferences
forma 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
PreferenceScreen
usando elPreferences API
, así que pensé en contribuir con mi propio Ejemplo completo. Esto incluye actualizar elSummary
Valor nuevo / cambiado, así como escuchar y reaccionar a los cambios.PD. Para responder a su última pregunta: para mostrar un valor predeterminado para
Summary
la creación inicial dePreferenceScreen
(antes de cualquier cambio en el valor), simplemente puede establecer elandroid:summary
valor de su elección, desde elpreferences.xml
archivo 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 dePreference
como 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 comoSummary
a 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 usandoSwitchPreference
class, por lo tanto, el código sería como: SettingsActivity.classLuego, en la actividad en la que desea usar el
PrefernceFragment
valor, simplemente use elSharedPreference
objeto para llamar a los valores y activarlo.fuente