Seperti dijelaskan di sini , saya membuat subclass PreferenceFragment dan menampilkannya di dalam Activity. Dokumen itu menjelaskan cara mendengarkan perubahan preferensi di sini , tetapi hanya jika Anda membuat subkelas PreferenceActivity. Karena saya tidak melakukan itu, bagaimana cara mendengarkan perubahan preferensi?
Saya telah mencoba menerapkan OnSharedPreferenceChangeListener di PreferenceFragment saya tetapi tampaknya tidak berhasil ( onSharedPreferenceChanged
sepertinya tidak pernah dipanggil).
Ini adalah kode saya sejauh ini:
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, ""));
}
}
}
preferensi.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>
Juga, apakah PreferenceFragment bahkan merupakan tempat yang tepat untuk mendengarkan perubahan preferensi atau haruskah saya melakukannya dalam Aktivitas?
sumber
Jawaban:
Saya yakin Anda hanya perlu mendaftar / membatalkan pendaftaran
Listener
di AndaPreferenceFragment
dan itu akan berhasil.Bergantung pada apa yang ingin Anda lakukan, Anda mungkin tidak perlu menggunakan pendengar. Perubahan pada preferensi dilakukan
SharedPreferences
secara otomatis.sumber
getPreferenceManager
(seperti yang Anda lakukan) ataugetPreferenceScreen
? Apa bedanya?getPreferenceManager
umumnya merupakan opsi yang disukai.key
parameternya? Belum mencoba ini, Anda memiliki contoh dalam jawaban Gunnar di bawah ini:onSharedPreferenceChanged(null, "")
. Ini mungkin tidak sesuai dengan kebutuhan Anda. Mungkin Anda harus mengulang pada kunci preferensi Anda yang memerlukan pembaruanSolusi antew berfungsi dengan baik, di sini Anda dapat melihat aktivitas preferensi lengkap untuk Android v11 dan seterusnya:
sumber
Semua jawaban lainnya benar. Tetapi saya lebih menyukai alternatif ini karena Anda segera memiliki instance Preferensi yang menyebabkan perubahan.
sumber
onSharedPreferenceChanged ()
Anda dapat mengakses instance Preferensi dengan mudahfindPreference(key)
. MungkinSharedPreferences
cara tersebut lebih disukai karena hal registering / unregistering?Ini berhasil untuk saya dari PreferenceFragment.onCreate ()
sumber
Berikut salah satu cara untuk melakukannya dan menghindari potensi kebocoran memori:
sumber
Contoh lengkap lainnya sehingga Anda melihat keseluruhan gambar.
sumber
Saya baru saja selesai menyusun sendiri
PreferenceScreen
menggunakanPreferences API
, jadi saya pikir saya akan menyumbangkan Contoh lengkap saya sendiri .. Ini termasuk memperbaruiSummary
ke Nilai baru / diubah, serta Mendengarkan dan bereaksi terhadap perubahan.PS. Untuk menjawab pertanyaan terakhir Anda: Untuk menampilkan nilai default untuk
Summary
saat pembuatan awalPreferenceScreen
(sebelum perubahan dalam nilai), Anda bisa hanya mengaturandroid:summary
untuk Nilai yang Anda pilih, dari dalampreferences.xml
berkas langsung - dan kemudian, setelah ada adalah perubahan Nilai, itu akan diperbarui secara otomatis dengan menggunakan kode yang terdapat dalam Contoh saya di bawah ini. Secara pribadi , saya menggunakan penjelasan singkat tentangPreference
inisial sayaSummary
, Diatur dalam sayapreferences.xml
, dan kemudian setelah Nilai tidak bisa berubah untuk pertama kalinya, itu hanya akan menunjukkan Nilai saat ini sebagaiSummary
dari saat itu ..Bagaimanapun , di sini adalah lengkap saya Contoh:
SettingsFragment.java
Saya harap ini membantu!
Setiap umpan balik positif sangat dihargai, karena saya cukup baru di StackOverflow;)
Selamat membuat kode!
sumber
onPause
, haruskahsuper.onPause()
dipanggil sebelum atau setelah pendengar tidak terdaftar? Apakah ada perbedaan? Saya telah melihat keduanya dalam banyak contohsuper.onPause();
mungkin adalah cara terbaik untuk melakukannya.Anda hanya perlu menghapus kelas Prefernce yang ditentukan dalam
onResume()
metode Anda . Dalam kasus saya, saya menggunakanSwitchPreference
kelas, oleh karena itu kodenya akan seperti- SettingsActivity.classKemudian dalam aktivitas di mana Anda ingin menggunakan
PrefernceFragment
nilai, cukup gunakanSharedPreference
objek untuk memanggil nilai dan memicunya.sumber