Menyesuaikan setelan   Bagian dari Android Jetpack.

Topik ini menjelaskan cara menyesuaikan Preferences dalam hierarki Anda.

Menemukan Preference

Untuk mengakses Preference tertentu, misalnya saat mendapatkan atau menyetel nilai Preference, gunakan PreferenceFragmentCompat.findPreference(). Metode ini menelusuri seluruh hierarki untuk menemukan Preference dengan kunci yang ditentukan.

Misalnya, anggaplah 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 signaturePreference: EditTextPreference? = findPreference("signature")
    // do something with this preference
}

Java

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

Mengontrol visibilitas Preference

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

Untuk menampilkan Preference hanya ketika sebuah kondisi terpenuhi, pertama-tama tetapkan visibilitas Preference dalam XML ke false, seperti ditunjukkan dalam contoh di bawah:

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

Selanjutnya, dalam onCreatePreferences(), tampilkan Preference jika kondisi yang terkait terpenuhi:

Kotlin

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

Java

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

Memperbarui ringkasan secara dinamis

Preference yang menyimpan data harus menampilkan nilai saat ini dalam ringkasannya untuk membantu pengguna lebih memahami status Preference saat ini. Misalnya, EditTextPreference harus menunjukkan nilai teks yang saat ini disimpan, dan ListPreference harus menunjukkan entri daftar yang saat ini dipilih. Anda mungkin juga memiliki Preferences yang perlu memperbarui ringkasannya berdasarkan status aplikasi internal atau eksternal — misalnya, Preference yang menampilkan nomor versi. Ini dapat dilakukan menggunakan SummaryProvider.

Menggunakan SimpleSummaryProvider

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

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

Atau, dalam kode, Anda dapat menggunakan ListPreference.SimpleSummaryProvider.getInstance() dan EditTextPreference.SimpleSummaryProvider.getInstance() untuk mendapatkan instance SummaryProvider sederhana, lalu menetapkannya di Preference, seperti ditunjukkan dalam 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 kustom

Anda dapat membuat SummaryProvider sendiri dan mengganti provideSummary() untuk menyesuaikan ringkasan setiap kali diminta oleh Preference. Misalnya, EditTextPreference di bawah menampilkan panjang nilai tersimpannya sebagai ringkasan:

Sebagai contoh, asumsikan EditTextPreference berikut:

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

Dalam onCreatePreferences(), buat SummaryProvider baru, dan ganti provideSummary() untuk menampilkan ringkasan yang akan ditampilkan:

Kotlin

val countingPreference: EditTextPreference? = findPreference("counting")

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 = findPreference("counting");

if (countingPreference != null) {
    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();
        }
    });
}

Sekarang, ringkasan Preference akan menampilkan panjang nilai tersimpan, atau "Not set" jika tidak ada nilai yang tersimpan.

Menyesuaikan dialog EditTextPreference

Dalam dialog EditTextPreference, Anda dapat menyesuaikan perilaku kolom teks dengan menautkan OnBindEditTextListener Pemroses ini dipanggil saat dialog ditampilkan kepada pengguna.

Sebagai contoh, Anda dapat menyesuaikan dialog untuk hanya menerima angka. Pertama, buat EditTextPreference:

<EditTextPreference
        app:key="number"
        app:title="Numbers only preference"/>

Selanjutnya, di onCreatePreferences(), buat OnBindEditTextListener baru, dan ganti onBindEditText() untuk menyesuaikan EditText saat ditampilkan kepada pengguna.

Kotlin

val numberPreference: EditTextPreference? = findPreference("number")

numberPreference?.setOnBindEditTextListener { editText ->
    editText.inputType = InputType.TYPE_CLASS_NUMBER
}

Java

EditTextPreference numberPreference = findPreference("number");

if (numberPreference != null) {
    numberPreference.setOnBindEditTextListener(
            new EditTextPreference.OnBindEditTextListener() {
                @Override
                public void onBindEditText(@NonNull EditText editText) {
                    editText.setInputType(InputType.TYPE_CLASS_NUMBER);
                }
            });
}

Sekarang, saat dialog ditampilkan kepada pengguna, keyboard akan terbuka dalam mode angka saja, sehingga pengguna hanya dapat memasukkan angka ke dalam EditText.

Tindakan Preference

Preference dapat memiliki tindakan tertentu saat diketuk. Misalnya, Preference dapat bertindak sebagai link ke bagian lain pada aplikasi Anda. Untuk menambahkan tindakan ke Preference, Anda dapat menetapkan Intent di Preference secara langsung, atau menetapkan OnPreferenceClickListener untuk logika yang lebih spesifik.

Menetapkan Intent

Anda dapat menetapkan Intent pada Preference untuk meluncurkan Fragment atau Activity yang baru, atau aplikasi terpisah setiap kali Preference diketuk. Ini sama seperti menggunakan Context.startActivity() dengan Intent tertentu.

Anda dapat menyetel Intent dalam XML menggunakan tag <intent> bertingkat. Contoh di bawah 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() langsung pada Preference, seperti ditunjukkan di bawah ini:

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 menyertakan kapabilitas tambahan 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 menetapkan OnPreferenceClickListener pada Preference, yang menambahkan callback ke onPreferenceClick() saat Preference diketuk. Misalnya, Anda dapat menggunakan pemroses untuk menavigasi ke Fragment atau Activity lain jika Anda memiliki logika yang lebih kompleks untuk menangani navigasi.

Untuk menetapkan OnPreferenceClickListener, gunakan kode yang mirip dengan berikut ini:

Kotlin

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

Java

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