Ini harus sering muncul.
Saat pengguna mengedit preferensi di aplikasi Android, saya ingin mereka dapat melihat nilai preferensi yang saat ini ditetapkan dalam Preference
ringkasan.
Contoh: jika saya memiliki pengaturan Preferensi untuk "Buang pesan lama" yang menentukan jumlah hari setelah mana pesan perlu dibersihkan. Dalam PreferenceActivity
Saya ingin pengguna melihat:
"Buang pesan lama" <- judul
"Bersihkan pesan setelah x hari" <- ringkasan di mana x adalah nilai Preferensi saat ini
Kredit ekstra: buat ini dapat digunakan kembali, jadi saya dapat dengan mudah menerapkannya ke semua preferensi saya terlepas dari jenisnya (sehingga bekerja dengan EditTextPreference, ListPreference dll. Dengan jumlah pengkodean minimal).
implements OnSharedPreferenceChangeListener
"%s"
untukListPreference
, danListPreference.getSummary()
akan memformat ringkasan dengan entri yang dipilih saat ini (atau""
jika tidak ada yang dipilih).Inilah solusi saya ... FWIW
sumber
EditTextPreference
yangandroid:password="true"
menunjukkan nilaiif editTextPref.getText() == ""
)? Bagaimana cara mendapatkan nilai ringkasanupdatePrefSummary
?p.getSummary()
daneditTextPref.getSummary()
mengembalikan nilai yang sudah dimodifikasi.PreferenceCategory
danPreferenceScreen
mewarisi dariPreferenceGroup
, saya telah berubahinitSummary
untuk menanganiPreferenceGroup
. Ini menghindari perlunya loop lain dionCreate()
. Perubahan perilaku: PreferensiScreens bersarang sekarang juga dapat ditangani secara rekursif.Dokumentasi Android mengatakan seseorang dapat menggunakan penanda pemformatan String di
getSummary()
:Cukup menentukan
android:summary="Clean up messages after %s days"
dalam deklarasi ListPreference xml bekerja untuk saya.Catatan: Ini hanya berfungsi untuk
ListPreference
.sumber
android:defaultValue="0"
di ListPreference Anda. Ini adalah jawaban yang paling masuk akal dan berfungsi untuk saya.defaultValue
dan yang%s
tidak berfungsi. Pada versi lain, umumnya, ini berfungsi. Ada solusi, tolong? Saya yakin tidak ingin menulis kelas khusus untuk ini. Sulit dipercaya bahwa Google membuat tugas yang paling sepele seperti menyakitkan.Jika Anda menggunakan
PreferenceFragment
, ini adalah bagaimana saya menyelesaikannya. Cukup jelas.sumber
updatePreference
CODEif (preference instanceof EditTextPreference) { EditTextPreference editTextPref = (EditTextPreference) preference; preference.setSummary(editTextPref.getText()); }
terima kasih @EddieBunregisterOnSharedPreferenceChangeListener
?findPreference(CharSequence key) This method was deprecated in API level 11. This function is not relevant for a modern fragment-based PreferenceActivity.
PreferenceActivity.findPreference
(dan beberapa metode lain), karena Google ingin Anda beralih ke teknik yang ditunjukkan dalam jawaban ini, yang menggunakanPreferenceFragment.findPreference
sebaliknya.Opsi saya adalah memperluas ListPreference dan bersih:
Kemudian Anda tambahkan di settings.xml Anda:
sumber
init()
Fungsi ini diperlukan untuk memperbaruisummary
ketika pengguna mengubah preferensi itu. Tanpa itu, itu hanya akan tinggal apa pun entri awalnya.Anda dapat mengganti kelas Preferensi default dan mengimplementasikan fitur.
Kemudian pada Anda xml, Anda dapat menggunakan preferensi khusus seperti
sumber
Setelah beberapa jam saya dihabiskan untuk menyelesaikan masalah seperti itu saya telah menerapkan kode ini:
[UPDATE: daftar versi final]
Itu adalah satu-satunya solusi yang bekerja untuk saya dengan baik. Sebelumnya saya sudah mencoba subclass dari ListPreferences dan mengimplementasikan android: summary = "bla bla bla% s". Tidak ada yang berhasil.
sumber
Mungkin seperti ListPreference: Ubah getSummary untuk mendapatkan yang Anda inginkan:
Dan gunakan ini di xml Anda:
Jadi, Anda dapat menulis ringkasan dengan
%s
bukan nilai sebenarnya.sumber
android.support.v7.preference.EditTextPreference
, ini tidak memperbarui ringkasan ketika preferensi diubah, hanya ketika aktivitas preferensi dibuat. Cara mengatasi hal ini tanpa menerapkanOnSharedPreferenceChangeListener.onSharedPreferenceChanged
dalam kelas fragmen preferensi adalah juga menimpaandroid.support.v7.preference.EditTextPreference.setText(String text)
:@Override public void setText(String text) { super.setText(text); this.setSummary(this.getText()); }
Ini adalah kode yang Anda butuhkan untuk mengatur ringkasan ke nilai yang dipilih. Ini juga menetapkan nilai-nilai pada saat startup dan menghormati nilai-nilai default, tidak hanya pada perubahan. Cukup ubah "R.layout.prefs" ke file xml Anda dan perluas metode setSummary sesuai kebutuhan Anda. Ini sebenarnya hanya menangani ListPreferences, tetapi mudah untuk menyesuaikan agar menghargai Preferensi lain.
koem
sumber
setOnPreferenceChangeListener(Preference.OnPreferenceChangeListener onPreferenceChangeListener)
-metode Preferensi individual.Sebenarnya, CheckBoxPreference memang memiliki kemampuan untuk menentukan ringkasan berbeda berdasarkan nilai kotak centang. Lihat atribut android: summaryOff dan android: summaryOn (serta metode CheckBoxPreference yang sesuai).
sumber
Untuk EditTextPreference:
sumber
Jika seseorang masih mencari jawaban untuk ini, Anda harus memeriksa jawaban tiga puluh tiga .
sumber
Terima kasih atas tip ini!
Saya memiliki satu layar preferensi dan ingin menunjukkan nilai untuk setiap preferensi daftar sebagai ringkasan.
Ini cara saya sekarang:
Ini bekerja untuk saya, tapi saya bertanya-tanya apa solusi terbaik (kinerja, stabilitas, skalibilitas): yang Koem tunjukkan atau yang ini?
sumber
Terima kasih, Reto, untuk penjelasan terperinci!
Dalam hal ini dapat membantu siapa pun, saya harus mengubah kode yang diusulkan oleh Reto Meier agar berfungsi dengan SDK untuk Android 1.5
Perubahan yang sama berlaku untuk fungsi panggilan balik
onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key)
Bersulang,
Chris
sumber
Saya memecahkan masalah dengan keturunan ListPreference berikut:
Tampaknya bekerja dengan baik untuk saya dalam 1,6 hingga 4,0,4.
sumber
sumber
Saya telah melihat semua jawaban memberi suara menunjukkan cara mengatur ringkasan dengan nilai saat ini yang tepat, tetapi OP juga menginginkan sesuatu seperti:
Inilah jawaban saya untuk mencapainya
Seperti yang dikatakan dokumentasi tentang
ListPreference.getSummary()
:Namun, saya mencoba beberapa perangkat dan sepertinya tidak berhasil. Dengan beberapa penelitian, saya menemukan solusi yang baik dalam jawaban ini . Ini hanya terdiri dari memperluas setiap
Preference
Anda menggunakan dan menimpagetSummary()
untuk bekerja sebagaimana ditentukan oleh dokumentasi Android.sumber
Jika Anda hanya ingin menampilkan nilai teks biasa dari masing-masing bidang sebagai rangkumannya, kode berikut ini harus paling mudah dipertahankan. Ini hanya membutuhkan dua perubahan (baris 13 dan 21, ditandai dengan "ubah di sini"):
sumber
Inilah solusi saya:
Buat metode 'pengambil' jenis preferensi.
Bangun metode 'setSummaryInit'.
Inisialisasi
Buat kelas publik yang PreferenceActivity dan mengimplementasikan OnSharedPreferenceChangeListener
sumber
Secara sederhana:
sumber
FYI:
Semua alasan lagi untuk melihat slick
Answer
dari @ ASD di atas ( sumber ditemukan di sini ) mengatakan untuk digunakan%s
dalamandroid:summary
untuk setiap bidang dalampreferences.xml
. (Nilai preferensi saat ini diganti untuk%s
.)sumber
Karena di androidx Preference kelas memiliki antarmuka SummaryProvider , itu dapat dilakukan tanpa OnSharedPreferenceChangeListener. Implementasi sederhana disediakan untuk EditTextPreference dan ListPreference. Membangun jawaban EddieB bisa terlihat seperti ini. Diuji pada androidx.preference: preferensi: 1.1.0-alpha03.
sumber
Menurut dokumen Android yang dapat Anda gunakan
app:useSimpleSummaryProvider="true"
dalam komponen ListPreference dan EditTextPreference.sumber
Di sini, semua ini dipotong dari sampel Eclipse
SettingsActivity
. Saya harus menyalin semua kode ini terlalu banyak untuk menunjukkan bagaimana pengembang android ini memilih dengan sempurna untuk gaya pengkodean yang lebih umum dan stabil.Saya meninggalkan kode untuk mengadaptasi
PreferenceActivity
tablet ke dan API yang lebih besar.xml/pref_general.xml
values/strings_activity_settings.xml
CATATAN: Sebenarnya saya hanya ingin berkomentar seperti "Sampel Google untuk PreferenceActivity juga menarik". Tapi saya tidak punya poin reputasi yang cukup. Jadi tolong jangan salahkan saya.
(Maaf untuk bahasa Inggris yang buruk)
sumber
Anda harus menggunakan fungsi bindPreferenceSummaryToValue pada metode onCreate.
Contoh:
Lihat pelajaran 3 tentang Udacity Android Course: https://www.udacity.com/course/viewer#!/c-ud853/l-1474559101/e-1643578599/m-1643578601
sumber
Untuk EditTextPreference :
Saya datang ke solusi ini, tentu saja, hanya jika Anda memerlukan preferensi edittext tertentu tetapi Anda bisa melakukan ini dengan setiap Preferensi:
............
............
Kemudian di onResume ();
Di:
sumber
Solusi saya adalah membuat custom
EditTextPreference
, digunakan dalam XML seperti ini:<com.example.EditTextPreference android:title="Example Title" />
EditTextPreference.java : -
sumber
Untuk mengatur ringkasan a
ListPreference
ke nilai yang dipilih dalam dialog, Anda dapat menggunakan kode ini:dan referensi
yourpackage.ListPreference
objek dalampreferences.xml
ingatan Anda untuk menentukan di sana Andaandroid:defaultValue
karena ini memicu panggilan untukonSetInitialValue()
.Jika mau, Anda dapat memodifikasi teks sebelum memanggil
setSummary()
apa pun yang sesuai dengan aplikasi Anda.sumber
Karena saya menggunakan kustom
PreferenceDataStore
, saya tidak bisa menambahkan pendengar ke beberapaSharedPreference
jadi saya harus menulis solusi yang agak aneh yang mendengarkan setiap preferensi:sumber
Jika Anda menggunakan AndroidX Anda dapat menggunakan kustom
SummaryProvider
. Pendekatan ini bisa digunakan untuk apa sajaPreference
.Contoh dari dokumentasi (Jawa):
Contoh dari dokumentasi (Kotlin):
sumber