Setelan   Bagian dari Android Jetpack.

Dengan setelan, pengguna dapat mengubah fungsi dan perilaku aplikasi. Pengaturan dapat memengaruhi perilaku latar belakang, seperti seberapa sering aplikasi menyinkronkan data dengan {i>cloud<i}, atau mereka bisa menjangkau lebih luas, seperti mengubah isi dan tampilan antarmuka pengguna.

Untuk mengintegrasikan setelan yang dapat dikonfigurasi pengguna ke aplikasi Anda, gunakan AndroidX Library Preference. Library ini mengelola antarmuka pengguna dan berinteraksi dengan penyimpanan sehingga Anda hanya menentukan pengaturan individual yang dapat digunakan pengguna dikonfigurasikan. Library ini dilengkapi dengan tema Desain Material yang menyediakan pengalaman pengguna yang konsisten di seluruh perangkat dan versi OS.

Memulai

Preference adalah bangunan dasar blok library Preference. Layar setelan berisi Preference hierarki. Anda dapat mendefinisikan hierarki ini sebagai resource XML, atau membangun hierarki dalam kode.

Bagian berikut menjelaskan cara membangun layar pengaturan sederhana menggunakan Library AndroidX Preference.

Sebelum memulai, tambahkan dependensi library Preference ke build.gradle file:

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 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: elemen SwitchPreferenceCompat yang memungkinkan pengguna mengaktifkan dan menonaktifkan setelan, serta Preference dasar tanpa .

Saat mem-build hierarki, setiap Preference harus memiliki kunci unik.

Meng-inflate hierarki

Untuk meng-inflate hierarki dari atribut XML, buat objek PreferenceFragmentCompat, abaikan onCreatePreferences(), dan menyediakan resource XML untuk meng-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:

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 ditampilkan dalam gambar berikut:

Gambar yang menampilkan contoh layar Preferensi
Gambar 1. Layar setelan yang dibuat menggunakan dua Preference objek terstruktur dalam jumlah besar.

Memantau preferensi

Anda bisa mendapatkan peristiwa saat preferensi berubah dengan mendaftarkan pemroses untuk hal tersebut:

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 sebagian besar mesin yang terlibat dalam penyimpanan dan untuk 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 dari SharedPreferences default untuk aplikasi, mengakses semua nilai yang disimpan, melakukan loop, dan mencetaknya Logcat.