Menyesuaikan setelan Anda   Part of Android Jetpack.

Topik ini menjelaskan cara menyesuaikan Preferences dalam hierarki Anda.

Menemukan Preferensi

Untuk mengakses Preference terpisah, seperti ketika mendapatkan atau menyetel nilai Preference, gunakan PreferenceFragmentCompat.findPreference(). Metode ini mencari seluruh hierarki untuk Preference dengan kunci yang diberikan.

Sebagai contoh, ditentukan EditTextPreference dengan kunci "signature":

<EditTextPreference
        app:key="signature"
        app:title="Your signature"/>

Kita dapat mengambil Preference ini menggunakan kode berikut:

Kotlin

override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
    setPreferencesFromResource(R.xml.preferences, rootKey)
    val preference = findPreference("signature") as EditTextPreference
    // do something with this preference
}

Java

@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
    setPreferencesFromResource(R.xml.preferences, rootKey);
    EditTextPreference preference = (EditTextPreference) findPreference("signature");
    // do something with this preference
}

Visibilitas Preferensi Kontrol

Anda dapat mengontrol Preferences mana yang terlihat oleh pengguna ketika mereka membuka layar setelan. Misalnya, jika Preference tertentu hanya bermakna ketika fitur terkait diaktifkan, Anda mungkin ingin menyembunyikan Preference tersebut ketika fitur dinonaktifkan.

Untuk memperlihatkan Preference saja ketika sebuah kondisi terpenuhi, pertama-tama setel visibilitas Preference ke false dalam XML, seperti yang ditunjukkan dalam contoh di bawah:

<EditTextPreference
        app:key="signature"
        app:title="Your signature"
        app:isPreferenceVisible="false"/>

Selanjutnya, di onCreatePreferences(), perlihatkan Preference ketika kondisi yang sesuai terpenuhi:

Kotlin

override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
    setPreferencesFromResource(R.xml.preferences, rootKey)
    if(*/\*some feature\*/*) {
        val preference = findPreference("signature")
        preference.isVisible = true
    }
}

Java

@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
    setPreferencesFromResource(R.xml.preferences, rootKey);
    if(*/\*some feature\*/*) {
        Preference editTextPreference = findPreference("signature");
        editTextPreference.setVisible(true);
    }
}

Mengupdate ringkasan secara dinamis

Suatu Preference yang mempertahankan data harus menampilkan nilai saat ini di dalam _summary_nya untuk membantu pengguna lebih memahami kondisi Preference saat ini. Misalnya, EditTextPreference harus memperlihatkan nilai teks yang disimpan saat ini, dan ListPreference harus memperlihatkan entri daftar yang saat ini dipilih. Anda mungkin juga memiliki Preferences yang perlu mengupdate ringkasannya berdasarkan keadaan aplikasi internal atau eksternal—suatu Preference yang menampilkan nomor versi, misalnya. Ini dapat dilakukan dengan menggunakan SummaryProvider.

Menggunakan SimpleSummaryProvider

ListPreference dan EditTextPreference. mencakup implementasi SummaryProvider sederhana yang secara otomatis menampilkan nilai Preference yang disimpan sebagai ringkasan. Jika tidak ada nilai yang disimpan, akan ditampilkan "Not set".

Anda dapat mengaktifkan implementasi ini dari XML dengan menyetel app:useSimpleSummaryProvider="true".

Atau sebagai alternatifnya, di kode Anda dapat menggunakan ListPreference.SimpleSummaryProvider.getInstance() dan EditTextPreference.SimpleSummaryProvider.getInstance() untuk mendapatkan instance SummaryProvider sederhana, lalu menyetelnya di Preference, seperti diperlihatkan pada contoh berikut:

Kotlin

listPreference.summaryProvider = ListPreference.SimpleSummaryProvider.getInstance()
editTextPreference.summaryProvider = EditTextPreference.SimpleSummaryProvider.getInstance()

Java

listPreference.setSummaryProvider(ListPreference.SimpleSummaryProvider.getInstance());
editTextPreference.setSummaryProvider(EditTextPreference.SimpleSummaryProvider.getInstance());

Menggunakan SummaryProvider khusus

Anda dapat membuat SummaryProvider Anda sendiri dan menimpa provideSummary() untuk menyesuaikan ringkasan kapan pun diminta oleh Preference. Sebagai contoh, EditTextPreference di bawah menampilkan panjang nilai yang disimpan sebagai ringkasan:

Sebagai contoh, asumsikan EditTextPreferenceberikut:

<EditTextPreference
        app:key="counting"
        app:title="Counting preference"/>

Di onCreatePreferences(), buat SummaryProvider baru, dan timpa provideSummary() untuk mengembalikan ringkasan yang akan ditampilkan:

Kotlin

val countingPreference = findPreference("counting") as EditTextPreference

countingPreference.summaryProvider = SummaryProvider<EditTextPreference> { preference ->
    val text = preference.text
    if (TextUtils.isEmpty(text)) {
        "Not set"
    } else {
        "Length of saved value: " + text.length
    }
}

Java

EditTextPreference countingPreference = (EditTextPreference) findPreference("counting");

countingPreference.setSummaryProvider(new SummaryProvider<EditTextPreference>() {
    @Override
    public CharSequence provideSummary(EditTextPreference preference) {
        String text = preference.getText();
        if (TextUtils.isEmpty(text)){
            return "Not set";
        }
        return "Length of saved value: " + text.length();
    }
});

Ringkasan Preference sekarang menampilkan panjang nilai yang disimpan atau "Not set" ketika tidak ada nilai yang disimpan.

Tindakan preferensi

Sebuah Preference dapat memiliki tindakan spesifik saat diketuk. Misalnya, suatu Preference dapat bertindak sebagai link ke bagian terpisah dari aplikasi Anda. Untuk menambahkan suatu tindakan ke Preference, Anda dapat menyetel Intent pada Preference secara langsung, atau Anda dapat menyetel OnPreferenceClickListener untuk logika yang lebih spesifik.

Menyetel Intent

Anda dapat menyetel Intent pada Preference untuk meluncurkan Fragment, Activity baru, atau memisahkan aplikasi setiap kali Preference diketuk. Ini sama dengan menggunakan Context.startActivity() dengan Intent yang ditentukan.

Anda dapat menyetel Intent dalam XML menggunakan tag <intent> bertumpuk. Contoh di bawah ini menentukan Intent yang meluncurkan Activity:

<Preference
        app:key=”activity”
        app:title="Launch activity">
    <intent
            android:targetPackage="com.example"
            android:targetClass="com.example.ExampleActivity"/>
</Preference>

Atau, Anda dapat menggunakan setIntent() secara langsung pada Preference, seperti yang diperlihatkan di bawah:

Kotlin

val intent = Intent(context, ExampleActivity::class.java)
activityPreference.setIntent(intent)

Java

Intent intent = new Intent(getContext(), ExampleActivity.class);
activityPreference.setIntent(intent);

Anda juga dapat memasukkan ekstra dengan Intent melalui XML:

<Preference
        app:key=”activity”
        app:title="Launch activity">
    <intent
            android:targetPackage="com.example"
            android:targetClass="com.example.ExampleActivity">
        <extra
                android:name="example_key"
                android:value="example_value"/>
    </intent>
</Preference>

Berikut adalah contoh Preference dengan Intent yang meluncurkan halaman web:

<Preference
        app:key=”webpage”
        app:title="View webpage">
    <intent
            android:action="android.intent.action.VIEW"
            android:data="http://www.google.com" />
</Preference>

Kotlin

val intent = Intent(Intent.ACTION_VIEW)
intent.data = Uri.parse("http://www.google.com")
webpagePreference.setIntent(intent)

Java

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.google.com"));
webpagePreference.setIntent(intent);

OnPreferenceClickListener

Anda dapat menyetel OnPreferenceClickListener pada sebuah Preference, yang menambahkan callback ke onPreferenceClick() ketika Preference diketuk. Misalnya, Anda dapat menggunakan listener untuk menavigasi ke Fragment lainnya atau Activity jika Anda memiliki logika yang lebih kompleks untuk menangani navigasi.

Untuk menyetel OnPreferenceClickListener, gunakan kode yang mirip dengan yang berikut:

Kotlin

onClickPreference.setOnPreferenceClickListener({
    // do something
    true
})

Java

onClickPreference.setOnPreferenceClickListener(preference -> {
    // do something
    return true;
});