Setelan Bagian dari Android Jetpack.
Setelan memungkinkan pengguna mengubah fungsi dan perilaku aplikasi. Setelan dapat memengaruhi perilaku latar belakang, seperti seberapa sering aplikasi menyinkronkan data dengan cloud, atau dapat memiliki jangkauan yang lebih luas, seperti mengubah konten dan presentasi antarmuka pengguna.
Untuk mengintegrasikan setelan yang dapat dikonfigurasi oleh pengguna ke dalam aplikasi Anda, gunakan library Preference AndroidX. Library ini mengelola antarmuka pengguna dan berinteraksi dengan penyimpanan sehingga Anda hanya menentukan setelan individual yang dapat dikonfigurasi oleh pengguna. Library ini dilengkapi dengan tema Desain Material yang memberikan pengalaman pengguna yang konsisten di seluruh perangkat dan versi OS.
Mulai
Preference
adalah elemen penyusun
dasar library Preference. Layar setelan berisi hierarki
Preference
. Anda dapat menentukan hierarki ini sebagai resource XML, atau membuat
hierarki dalam kode.
Bagian berikut menjelaskan cara membuat layar setelan sederhana menggunakan library Preferensi AndroidX.
Sebelum memulai, tambahkan dependensi library Preference ke file build.gradle
Anda:
Groovy
dependencies { implementation "androidx.preference:preference-ktx:1.2.0" }
Kotlin
dependencies { implementation("androidx.preference:preference-ktx:1.2.0") }
Setelah Sinkronisasi Gradle, Anda dapat melanjutkan ke bagian XML dari tugas.
Membuat hierarki
Di project Anda, buka folder res/xml
, buat file preferences.xml
,
dan tambahkan kode berikut ke dalamnya:
<PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto"> <SwitchPreferenceCompat app:key="notifications" app:title="Enable message notifications"/> <Preference app:key="feedback" app:title="Send feedback" app:summary="Report technical issues or suggest new features"/> </PreferenceScreen>
Hierarki ini berisi dua objek Preference
: SwitchPreferenceCompat
yang memungkinkan pengguna mengaktifkan dan menonaktifkan setelan, dan Preference
dasar tanpa
widget.
Saat membuat hierarki, setiap Preference
harus memiliki kunci unik.
Meng-inflate hierarki
Untuk meng-inflate hierarki dari atribut XML, buat
PreferenceFragmentCompat
,
ganti
onCreatePreferences()
,
dan sediakan resource XML yang akan di-inflate, seperti ditunjukkan dalam contoh berikut:
Kotlin
class MySettingsFragment : PreferenceFragmentCompat() { override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { setPreferencesFromResource(R.xml.preferences, rootKey) } }
Java
public class MySettingsFragment extends PreferenceFragmentCompat { @Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { setPreferencesFromResource(R.xml.preferences, rootKey); } }
Selanjutnya, Anda dapat menambahkan Fragment
ini ke Activity
seperti yang Anda lakukan dengan
Fragment
lainnya:
Kotlin
class MySettingsActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) supportFragmentManager .beginTransaction() .replace(R.id.settings_container, MySettingsFragment()) .commit() } }
Java
public class MySettingsActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getSupportFragmentManager() .beginTransaction() .replace(R.id.settings_container, new MySettingsFragment()) .commit(); } }
Hasilnya ditunjukkan dalam gambar berikut:
Memantau preferensi
Anda bisa mendapatkan peristiwa saat preferensi berubah dengan mendaftarkan pemroses untuknya:
Kotlin
findPreference<SwitchPreferenceCompat>("notifications") ?.setOnPreferenceChangeListener { _, newValue -> Log.d("Preferences", "Notifications enabled: $newValue") true // Return true if the event is handled. } findPreference<Preference>("feedback") ?.setOnPreferenceClickListener { Log.d("Preferences", "Feedback was clicked") true // Return true if the click is handled. }
Java
SwitchPreferenceCompat notificationsPref = findPreference("notifications"); if (notificationsPref != null) { notificationsPref.setOnPreferenceChangeListener((preference, newValue) -> { Log.d("Preferences", String.format("Notifications enabled: %s", newValue)); return true; // Return true if the event is handled. }); } Preference feedbackPref = findPreference("feedback"); if (feedbackPref != null) { feedbackPref.setOnPreferenceClickListener((preference) -> { Log.d("Preferences", "Feedback was clicked"); return true; // Return true if the event is handled. }); }
Membaca nilai preferensi saat ini
PreferenceFragmentCompat
menyembunyikan banyak mesin yang terlibat dalam menyimpan dan
membaca preferensi. Namun, semuanya disimpan menggunakan
SharedPreferences
, dan Anda dapat membaca nilai ini seperti biasa dengan
SharedPreferences
:
Kotlin
val preferences = PreferenceManager.getDefaultSharedPreferences(this).all preferences.forEach { Log.d("Preferences", "${it.key} -> ${it.value}") }
Java
var preferences = PreferenceManager.getDefaultSharedPreferences(context).getAll(); preferences.forEach((key, value) ->{ Log.d("Preferences", String.format("%s -> %s", key, value)); });
Cuplikan sebelumnya mendapatkan instance SharedPreferences
default untuk
aplikasi, mengakses semua nilai yang tersimpan, melakukan loop, dan mencetaknya di
Logcat.