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:

Gambar yang menampilkan contoh layar Preferensi
Gambar 1. Layar setelan yang dibuat menggunakan dua objek Preference.

Memantau preferensi

Anda bisa mendapatkan peristiwa saat preferensi berubah dengan mendaftarkan pemroses untuknya:

Kotlin

findPreference("notifications")
    ?.setOnPreferenceChangeListener { _, newValue ->
        Log.d("Preferences", "Notifications enabled: $newValue")
        true // Return true if the event is handled.
    }

findPreference("feedback")
    ?.setOnPreferenceClickListener {
        Log.d("Preferences", "Feedback was clicked")
        true // Return true if the click is handled.
    }

Java

findPreference("notifications")
    ?.setOnPreferenceChangeListener { _, newValue ->
        Log.d("Preferences", "Notifications enabled: $newValue");
        true; // Return true if the event is handled.
    }

findPreference("feedback")
    ?.setOnPreferenceClickListener {
        Log.d("Preferences", "Feedback was clicked");
        true; // Return true if the click 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

val preferences = PreferenceManager.getDefaultSharedPreferences(this).all

preferences.forEach {
    Log.d("Preferences", "${it.key} -> ${it.value}")
}

Cuplikan sebelumnya mendapatkan instance SharedPreferences default untuk aplikasi, mengakses semua nilai yang tersimpan, melakukan loop, dan mencetaknya di Logcat.