Android 8.0 memperkenalkan arsitektur informasi baru untuk aplikasi Setelan guna menyederhanakan cara pengaturan diatur dan memudahkan pengguna untuk menemukan setelan dengan cepat guna menyesuaikan perangkat Android mereka. Android 9 memperkenalkan beberapa peningkatan untuk memberikan lebih banyak fungsi Setelan dan implementasi yang lebih mudah.
Contoh dan sumber
Sebagian besar halaman di Setelan saat ini diterapkan menggunakan framework baru. Contoh
yang baik adalah DisplaySettings:
packages/apps/Settings/src/com/android/settings/DisplaySettings.java
Jalur file untuk komponen penting tercantum di bawah ini:
- CategoryKey:
packages/SettingsLib/src/com/android/settingslib/drawer/CategoryKey.java
- DashboardFragmentRegistry:
packages/apps/Settings/src/com/android/settings/dashboard/DashboardFragmentRegistry.java
- DashboardFragment:
packages/apps/Settings/src/com/android/settings/dashboard/DashboardFragment.java
- AbstractPreferenceController:
frameworks/base/packages/SettingsLib/src/com/android/settingslib/core/AbstractPreferenceController.java
- BasePreferenceController (diperkenalkan di Android 9):
packages/apps/Settings/src/com/android/settings/core/BasePreferenceController.java
Implementasi
Produsen perangkat dianjurkan untuk menyesuaikan arsitektur informasi
Setelan yang ada dan menyisipkan halaman setelan tambahan sesuai kebutuhan untuk mengakomodasi
fitur khusus partner. Memindahkan preferensi dari halaman lama (diterapkan sebagai
SettingsPreferencePage
) ke halaman baru (diterapkan menggunakan
DashboardFragment
) dapat menjadi rumit. Preferensi dari
halaman lama kemungkinan tidak diterapkan dengan PreferenceController
.
Jadi, saat memindahkan preferensi dari halaman lama ke halaman baru, Anda perlu membuat
PreferenceController
dan memindahkan kode ke pengontrol sebelum
membuat instance-nya di DashboardFragment
baru. API yang
diperlukan PreferenceController
dijelaskan dalam namanya dan
didokumentasikan dalam Javadoc.
Sebaiknya tambahkan pengujian unit untuk setiap PreferenceController
.
Jika perubahan dikirimkan ke AOSP, pengujian unit diperlukan.
Untuk mendapatkan informasi selengkapnya tentang cara menulis pengujian berbasis Robolectric, lihat
file readme packages/apps/Settings/tests/robotests/README.md
.
Arsitektur informasi bergaya plugin
Setiap item setelan diimplementasikan sebagai Preferensi. Preference dapat dengan mudah dipindahkan dari satu halaman ke halaman lain.
Untuk memudahkan pemindahan beberapa setelan, Android 8.0 memperkenalkan fragmen host bergaya plugin yang berisi item setelan. Item setelan dimodelkan sebagai pengontrol bergaya plugin. Oleh karena itu, halaman setelan dibuat oleh satu fragmen host dan beberapa pengontrol setelan.
DashboardFragment
DashboardFragment
adalah host pengontrol preferensi gaya plugin.
Fragmen ini mewarisi dari PreferenceFragment
dan memiliki hook untuk
memperluas dan memperbarui daftar preferensi statis dan daftar preferensi dinamis.
Preferensi statis
Daftar preferensi statis ditentukan dalam XML menggunakan tag <Preference>
. Implementasi
DashboardFragment
menggunakan
metode getPreferenceScreenResId()
untuk menentukan file XML mana yang berisi
daftar preferensi statis yang akan ditampilkan.
Preferensi dinamis
Item dinamis mewakili kartu dengan intent, yang mengarah ke Aktivitas
eksternal atau internal. Biasanya, intent mengarah ke halaman setelan yang berbeda. Misalnya,
item setelan "Google" di halaman beranda Setelan adalah item dinamis. Item
dinamis ditentukan dalam AndroidManifest
(dibahas di bawah) dan dimuat
melalui FeatureProvider
(ditentukan sebagai
DashboardFeatureProvider
).
Setelan dinamis lebih berat daripada setelan yang dikonfigurasi secara statis, jadi biasanya developer harus menerapkan setelan sebagai setelan statis. Namun, setelan dinamis dapat berguna jika salah satu hal berikut berlaku:
- Setelan ini tidak diterapkan secara langsung di aplikasi Setelan (seperti memasukkan setelan yang diterapkan oleh aplikasi OEM/Operator).
- Setelan akan muncul di halaman beranda Setelan.
- Anda sudah memiliki Aktivitas untuk setelan dan tidak ingin menerapkan konfigurasi statis tambahan.
Untuk mengonfigurasi Aktivitas sebagai setelan dinamis, lakukan hal berikut:
- Tandai aktivitas sebagai setelan dinamis dengan menambahkan filter intent ke aktivitas.
- Beri tahu aplikasi Setelan kategori aplikasi tersebut. Kategori adalah konstanta,
yang ditentukan dalam
CategoryKey
. - Opsional: Tambahkan teks ringkasan saat setelan ditampilkan.
Berikut ini contoh yang diambil dari aplikasi Setelan untuk DisplaySettings
.
<activity android:name="Settings$DisplaySettingsActivity" android:label="@string/display_settings" android:icon="@drawable/ic_settings_display"> <!-- Mark the activity as a dynamic setting --> <intent-filter> <action android:name="com.android.settings.action.IA_SETTINGS" /> </intent-filter> <!-- Tell Settings app which category it belongs to --> <meta-data android:name="com.android.settings.category" android:value="com.android.settings.category.ia.homepage" /> <!-- Add a summary text when the setting is displayed --> <meta-data android:name="com.android.settings.summary" android:resource="@string/display_dashboard_summary"/> </activity>
Pada waktu render, fragmen akan meminta daftar Preferensi dari XML statis
dan setelan dinamis yang ditentukan di AndroidManifest
. Baik
PreferenceController
ditentukan dalam kode Java atau dalam XML,
DashboardFragment
mengelola logika penanganan setiap setelan
melalui PreferenceController
(dibahas di bawah). Kemudian, keduanya
ditampilkan di UI sebagai daftar campuran.
PengontrolPreferensi
Terdapat beberapa perbedaan antara penerapan PreferenceController
di Android 9 dan Android 8.x, seperti yang dijelaskan di bagian
ini.
PreferenceController dalam rilis Android 9
PreferenceController
berisi semua logika untuk berinteraksi dengan
preferensi, termasuk menampilkan, mengupdate, pengindeksan penelusuran, dll.
Antarmuka PreferenceController
ditentukan sebagai
BasePreferenceController
. Misalnya, lihat kode di
packages/apps/Settings/src/com/android/settings/core/
BasePreferenceController.java
Ada beberapa subclass BasePreferenceController
, yang masing-masing
dipetakan ke gaya UI tertentu yang didukung aplikasi Setelan secara default. Misalnya, TogglePreferenceController
memiliki API yang secara langsung memetakan
cara pengguna harus berinteraksi dengan UI preferensi berbasis tombol.
BasePreferenceController
memiliki API seperti
getAvailabilityStatus()
, displayPreference()
,
handlePreferenceTreeClicked(),
, dll. Dokumentasi mendetail untuk setiap
API ada di class antarmuka.
Batasan dalam menerapkan BasePreferenceController
(dan
subclass-nya seperti TogglePreferenceController
) adalah bahwa
tanda tangan konstruktor harus cocok dengan salah satu dari hal berikut:
public MyController(Context context, String key) {}
public MyController(Context context) {}
Saat menginstal preferensi ke fragmen, dasbor menyediakan metode untuk
melampirkan PreferenceController
sebelum waktu tampilan. Pada waktu penginstalan,
pengontrol dihubungkan ke fragmen sehingga semua peristiwa mendatang yang relevan
akan dikirim ke pengontrol.
DashboardFragment
menyimpan daftar
PreferenceController
di layar. Di
onCreate()
fragmen, semua pengontrol dipanggil untuk
metode getAvailabilityStatus()
, dan jika menampilkan nilai benar,
displayPreference()
akan dipanggil untuk memproses logika tampilan.
getAvailabilityStatus()
juga penting untuk memberi tahu framework
Setelan item mana yang tersedia selama penelusuran.
PreferenceController di rilis Android 8.x
PreferenceController
berisi semua logika untuk berinteraksi dengan
preferensi, termasuk menampilkan, mengupdate, menelusuri pengindeksan, dll.
Sesuai dengan interaksi preferensi, antarmuka
PreferenceController
memiliki API isAvailable()
,
displayPreference()
, handlePreferenceTreeClicked()
, dll. Dokumentasi mendetail tentang setiap API dapat ditemukan di class antarmuka.
Saat menginstal preferensi ke fragmen, dasbor menyediakan metode untuk
melampirkan PreferenceController
sebelum waktu tampilan. Pada waktu penginstalan,
pengontrol dihubungkan ke fragmen sehingga semua peristiwa relevan mendatang
akan dikirim ke pengontrol.
DashboardFragment
menyimpan daftar PreferenceControllers
di layar. Di onCreate()
fragmen, semua
pengontrol dipanggil untuk metode isAvailable()
, dan jika
menampilkan true, displayPreference()
akan dipanggil untuk memproses logika
tampilan.
Menggunakan DashboardFragment
Memindahkan preferensi dari halaman A ke B
Jika preferensi tersebut tercantum secara statis dalam file XML preferensi halaman asli, ikuti prosedur pemindahan Static untuk rilis Android Anda di bawah ini. Jika tidak, ikuti prosedur pemindahan Dinamis untuk rilis Android Anda.
Pemindahan statis di Android 9
- Temukan file XML preferensi untuk halaman asli dan halaman
tujuan. Anda dapat menemukan informasi ini dari metode
getPreferenceScreenResId()
halaman. - Hapus preferensi dari XML halaman asli.
- Tambahkan preferensi ke XML halaman tujuan.
- Hapus
PreferenceController
untuk preferensi ini dari implementasi Java halaman asli. Biasanya dalamcreatePreferenceControllers()
. Pengontrol dapat dideklarasikan dalam XML secara langsung.Catatan: Preferensi mungkin tidak memiliki
PreferenceController
. - Buat instance
PreferenceController
dicreatePreferenceControllers()
halaman tujuan. JikaPreferenceController
ditentukan dalam XML di halaman lama, tentukan dalam XML untuk halaman baru juga.
Pemindahan dinamis di Android 9
- Temukan kategori yang dihosting oleh halaman asli dan tujuan. Anda dapat menemukan informasi ini di
DashboardFragmentRegistry
. - Buka file
AndroidManifest.xml
yang berisi setelan yang perlu Anda pindahkan dan temukan entri Aktivitas yang mewakili setelan ini. - Tetapkan nilai metadata aktivitas untuk
com.android.settings.category
ke kunci kategori halaman baru.
Pemindahan statis dalam rilis Android 8.x
- Temukan file XML preferensi untuk halaman asli dan halaman tujuan. Anda dapat menemukan informasi ini dari metode
- Hapus preferensi di XML halaman asli.
- Tambahkan preferensi ke XML halaman tujuan.
- Hapus
PreferenceController
untuk preferensi ini dalam penerapan Java halaman asli. Biasanya dalamgetPreferenceControllers()
. - Buat instance
PreferenceController
digetPreferenceControllers()
halaman tujuan.
getPreferenceScreenResId()
halaman.
Catatan: Preferensi mungkin tidak memiliki
PreferenceController
.
Pemindahan dinamis dalam rilis Android 8.x
- Temukan kategori yang dihosting halaman asli dan tujuan. Anda dapat menemukan
informasi ini di
DashboardFragmentRegistry
. - Buka file
AndroidManifest.xml
yang berisi setelan yang perlu Anda ubah dan temukan entri Aktivitas yang mewakili setelan ini. - Ubah nilai metadata aktivitas untuk
com.android.settings.category
, tetapkan titik nilai ke kunci kategori halaman baru.
Membuat preferensi baru di halaman
Jika preferensi dicantumkan secara statis dalam file XML preferensi halaman asli, ikuti prosedur statis di bawah. Jika tidak, ikuti prosedur dinamis.
Membuat preferensi statis
- Temukan file XML preferensi untuk halaman. Anda dapat menemukan informasi ini dari metode getPreferenceScreenResId() halaman.
- Tambahkan item Preferensi baru di XML. Pastikan
android:key
-nya unik. -
Tentukan
PreferenceController
untuk preferensi ini di metodegetPreferenceControllers()
halaman.- Di Android 8.x dan secara opsional di Android 9,
buat instance
PreferenceController
untuk preferensi ini di metodecreatePreferenceControllers()
halaman.Jika preferensi ini sudah ada di tempat lain, mungkin sudah ada
PreferenceController
untuk preferensi tersebut. Anda dapat menggunakan kembaliPreferenceController
tanpa mem-build yang baru. -
Mulai Android 9, Anda dapat memilih untuk mendeklarasikan
PreferenceController
dalam XML di samping preferensi. Contoh:<Preference android:key="reset_dashboard" android:title="@string/reset_dashboard_title" settings:controller="com.android.settings.system.ResetPreferenceController"/>
- Di Android 8.x dan secara opsional di Android 9,
buat instance
Membuat preferensi dinamis
- Temukan kategori yang dihosting oleh halaman asli dan tujuan. Anda dapat menemukan
informasi ini di
DashboardFragmentRegistry
. - Membuat Aktivitas baru di
AndroidManifest
- Tambahkan metadata yang diperlukan ke Aktivitas baru untuk menentukan setelan. Tetapkan
nilai metadata untuk
com.android.settings.category
ke nilai yang sama yang ditentukan pada langkah 1.
Buat halaman baru
- Buat fragmen baru, yang mewarisi dari
DashboardFragment
. - Tentukan kategorinya di
DashboardFragmentRegistry
.Catatan: Langkah ini bersifat opsional. Jika tidak memerlukan preferensi dinamis di halaman ini, Anda tidak perlu memberikan kunci kategori.
- Ikuti langkah-langkah untuk menambahkan setelan yang diperlukan untuk halaman ini. Untuk mengetahui informasi selengkapnya, lihat bagian Implementasi.
Validasi
- Jalankan pengujian robolectric di Setelan. Semua pengujian yang ada dan baru harus berhasil.
- Build dan instal Setelan, lalu buka halaman yang diubah secara manual. Halaman akan segera diperbarui.