Android 8.0 memperkenalkan arsitektur informasi baru untuk aplikasi Pengaturan guna menyederhanakan cara pengaturan diatur dan memudahkan pengguna menemukan pengaturan dengan cepat untuk menyesuaikan perangkat Android mereka. Android 9 memperkenalkan beberapa peningkatan untuk menyediakan lebih banyak fungsi Pengaturan dan implementasi yang lebih mudah.
Contoh dan sumber
Sebagian besar halaman di Pengaturan saat ini diimplementasikan menggunakan kerangka kerja baru. Contoh yang bagus 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
Penerapan
Produsen perangkat didorong untuk mengadaptasi arsitektur informasi Pengaturan yang ada dan menyisipkan halaman pengaturan tambahan sesuai kebutuhan untuk mengakomodasi fitur khusus mitra. Memindahkan preferensi dari halaman lama (diimplementasikan sebagai SettingsPreferencePage
) ke halaman baru (diimplementasikan menggunakan DashboardFragment
) dapat menjadi rumit. Preferensi dari halaman lawas kemungkinan tidak diimplementasikan dengan PreferenceController
.
Jadi saat memindahkan preferensi dari halaman lama ke halaman baru, Anda perlu membuat PreferenceController
dan memindahkan kode ke pengontrol sebelum membuat instance di DashboardFragment
baru. API yang diperlukan PreferenceController
dijelaskan dalam namanya dan didokumentasikan di Javadoc.
Sangat disarankan untuk menambahkan unit test untuk setiap PreferenceController
. Jika perubahan diserahkan ke AOSP, maka diperlukan unit test. 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 pengaturan diimplementasikan sebagai Preferensi. Preferensi dapat dengan mudah dipindahkan dari satu halaman ke halaman lainnya.
Untuk mempermudah pemindahan beberapa setelan, Android 8.0 memperkenalkan fragmen host bergaya plugin yang berisi item setelan. Item pengaturan dimodelkan sebagai pengontrol gaya plugin. Oleh karena itu, halaman pengaturan dibuat oleh satu fragmen host dan beberapa pengontrol pengaturan.
Fragmen Dasbor
DashboardFragment
adalah host dari pengontrol preferensi gaya plugin. Fragmen mewarisi dari PreferenceFragment
dan memiliki kait untuk memperluas dan memperbarui daftar preferensi statis dan daftar preferensi dinamis.
Preferensi statis
Daftar preferensi statis didefinisikan dalam XML menggunakan tag <Preference>
. Implementasi DashboardFragment
menggunakan metode getPreferenceScreenResId()
untuk menentukan file XML mana yang berisi daftar preferensi statis untuk ditampilkan.
Preferensi dinamis
Item dinamis mewakili petak dengan maksud, yang mengarah ke Aktivitas eksternal atau internal. Biasanya, maksud mengarah ke halaman pengaturan yang berbeda. Misalnya, item setelan "Google" di beranda Setelan adalah item dinamis. Item dinamis didefinisikan dalam AndroidManifest
(dibahas di bawah) dan dimuat melalui FeatureProvider
(didefinisikan sebagai DashboardFeatureProvider
).
Pengaturan dinamis lebih berat daripada pengaturan yang dikonfigurasi secara statis, jadi biasanya pengembang harus menerapkan pengaturan sebagai pengaturan statis. Namun pengaturan dinamis dapat berguna jika salah satu dari berikut ini benar:
- Pengaturan tidak langsung diterapkan di aplikasi Pengaturan (seperti menyuntikkan pengaturan yang diterapkan oleh aplikasi OEM/Carrier).
- Pengaturan akan muncul di beranda Pengaturan.
- Anda sudah memiliki Aktivitas untuk pengaturan dan tidak ingin mengimplementasikan konfigurasi statis ekstra.
Untuk mengonfigurasi Aktivitas sebagai pengaturan dinamis, lakukan hal berikut:
- Tandai aktivitas sebagai setelan dinamis dengan menambahkan filter maksud ke aktivitas.
- Beri tahu aplikasi Pengaturan yang termasuk dalam kategori mana. Kategori adalah konstanta, yang didefinisikan dalam
CategoryKey
. - Opsional: Tambahkan teks ringkasan saat setelan ditampilkan.
Berikut adalah contoh yang diambil dari aplikasi Pengaturan 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 dalam AndroidManifest
. Apakah PreferenceController
s didefinisikan dalam kode Java atau XML, DashboardFragment
mengelola logika penanganan setiap pengaturan melalui PreferenceController
(dibahas di bawah). Kemudian mereka ditampilkan di UI sebagai daftar campuran.
Pengendali Preferensi
Ada perbedaan antara mengimplementasikan 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, memperbarui, mengindeks pencarian, dll.
Antarmuka PreferenceController
didefinisikan sebagai BasePreferenceController
. Misalnya, lihat kode di packages/apps/Settings/src/com/android/settings/core/ BasePreferenceController.java
Ada beberapa subkelas BasePreferenceController
, masing-masing memetakan ke gaya UI tertentu yang didukung oleh aplikasi Pengaturan secara default. Misalnya, TogglePreferenceController
memiliki API yang langsung memetakan bagaimana pengguna harus berinteraksi dengan UI preferensi berbasis tombol.
BasePreferenceController
memiliki API seperti getAvailabilityStatus()
, displayPreference()
, handlePreferenceTreeClicked(),
dll. Dokumentasi mendetail untuk setiap API ada di kelas antarmuka.
Batasan dalam mengimplementasikan BasePreferenceController
(dan subkelasnya seperti TogglePreferenceController
) adalah bahwa tanda tangan konstruktor harus cocok dengan salah satu dari berikut ini:
-
public MyController(Context context, String key) {}
-
public MyController(Context context) {}
Saat memasang preferensi ke fragmen, dasbor menyediakan metode untuk melampirkan PreferenceController
sebelum waktu tampilan. Pada waktu penginstalan, pengontrol dihubungkan ke fragmen sehingga semua peristiwa yang relevan di masa mendatang dikirim ke pengontrol.
DashboardFragment
menyimpan daftar PreferenceController
s di layar. Pada onCreate()
fragmen, semua pengontrol dipanggil untuk metode getAvailabilityStatus()
, dan jika mengembalikan true, displayPreference()
dipanggil untuk memproses logika tampilan. getAvailabilityStatus()
juga penting untuk memberi tahu kerangka kerja Pengaturan item mana yang tersedia selama pencarian.PreferenceController dalam rilis Android 8.x
PreferenceController
berisi semua logika untuk berinteraksi dengan preferensi, termasuk menampilkan, memperbarui, mencari pengindeksan. dll.
Sesuai dengan interaksi preferensi, antarmuka PreferenceController
memiliki API isAvailable()
, displayPreference()
, handlePreferenceTreeClicked()
dll. Dokumentasi terperinci pada setiap API dapat ditemukan di kelas antarmuka.
Saat memasang preferensi ke fragmen, dasbor menyediakan metode untuk melampirkan PreferenceController
sebelum waktu tampilan. Pada waktu penginstalan, pengontrol dihubungkan ke fragmen sehingga semua peristiwa yang relevan di masa mendatang dikirim ke pengontrol.
DashboardFragment
menyimpan daftar PreferenceControllers
di layar. Pada onCreate()
fragmen, semua pengontrol dipanggil untuk metode isAvailable()
, dan jika mengembalikan nilai true, displayPreference()
dipanggil untuk memproses logika tampilan.
Menggunakan DashboardFragment
Memindahkan preferensi dari halaman A ke B
Jika preferensi terdaftar secara statis di file XML preferensi halaman asli, ikuti prosedur Pemindahan statis untuk rilis Android Anda di bawah ini. Jika tidak, ikuti prosedur Pemindahan dinamis untuk rilis Android Anda.
Gerakan 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 dicreatePreferenceControllers()
. Kontroler mungkin dideklarasikan dalam XML secara langsung.Catatan : Preferensi mungkin tidak memiliki
PreferenceController
. - Buat instance
PreferenceController
dicreatePreferenceControllers()
halaman tujuan. JikaPreferenceController
didefinisikan dalam XML di halaman lama, tentukan juga dalam XML untuk halaman baru.
Gerakan dinamis di Android 9
- Temukan kategori mana yang dihosting halaman asli dan tujuan. Anda dapat menemukan informasi ini di
DashboardFragmentRegistry
. - Buka file
AndroidManifest.xml
yang berisi pengaturan yang perlu Anda pindahkan dan temukan entri Aktivitas yang mewakili pengaturan ini. - Setel nilai metadata aktivitas untuk
com.android.settings.category
ke kunci kategori halaman baru.
Gerakan 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 implementasi Java halaman asli. Biasanya ada digetPreferenceControllers()
. - Buat instance
PreferenceController
di halaman tujuangetPreferenceControllers()
.
getPreferenceScreenResId()
halaman. Catatan : Ada kemungkinan bahwa preferensi tidak memiliki PreferenceController
.
Gerakan dinamis dalam rilis Android 8.x
- Temukan kategori mana yang dihosting halaman asli dan tujuan. Anda dapat menemukan informasi ini di
DashboardFragmentRegistry
. - Buka file
AndroidManifest.xml
yang berisi pengaturan yang perlu Anda pindahkan dan temukan entri Aktivitas yang mewakili pengaturan ini. - Ubah nilai metadata aktivitas untuk
com.android.settings.category
, setel titik nilai ke kunci kategori halaman baru.
Membuat preferensi baru di halaman
Jika preferensi terdaftar secara statis dalam file XML preferensi halaman asli, ikuti prosedur statis di bawah ini. Jika tidak, ikuti prosedur dinamis .
Membuat preferensi statis
- Temukan file XML preferensi untuk halaman tersebut. Anda dapat menemukan informasi ini dari metode getPreferenceScreenResId() halaman.
- Tambahkan item Preferensi baru di XML. Pastikan ia memiliki
android:key
yang unik. - Tentukan
PreferenceController
untuk preferensi ini dalam metodegetPreferenceControllers()
halaman.- Di Android 8.x dan opsional di Android 9, buat instance
PreferenceController
untuk preferensi ini dalam metodecreatePreferenceControllers()
halaman.Jika preferensi ini sudah ada di tempat lain, mungkin sudah ada
PreferenceController
untuk itu. Anda dapat menggunakan kembaliPreferenceController
tanpa membuat yang baru. - Mulai di Android 9, Anda dapat memilih untuk mendeklarasikan
PreferenceController
dalam XML di sebelah preferensi. Misalnya:<Preference android:key="reset_dashboard" android:title="@string/reset_dashboard_title" settings:controller="com.android.settings.system.ResetPreferenceController"/>
- Di Android 8.x dan opsional di Android 9, buat instance
Membuat preferensi dinamis
- Temukan kategori mana yang dihosting halaman asli dan tujuan. Anda dapat menemukan informasi ini di
DashboardFragmentRegistry
. - Buat Aktivitas baru di
AndroidManifest
- Tambahkan metadata yang diperlukan ke Aktivitas baru untuk menentukan setelan. Setel nilai metadata untuk
com.android.settings.category
ke nilai yang sama yang ditentukan di langkah 1.
Buat halaman baru
- Buat fragmen baru, mewarisi dari
DashboardFragment
. - Tentukan kategorinya di
DashboardFragmentRegistry
.Catatan: Langkah ini opsional. Jika Anda tidak memerlukan preferensi dinamis apa pun di halaman ini, Anda tidak perlu memberikan kunci kategori.
- Ikuti langkah-langkah untuk menambahkan pengaturan yang diperlukan untuk halaman ini. Untuk informasi lebih lanjut, lihat bagian Implementasi .
Validasi
- Jalankan tes roboelektrik di Pengaturan. Semua tes yang ada dan yang baru harus lulus.
- Bangun dan instal Pengaturan, lalu buka halaman yang sedang dimodifikasi secara manual. Halaman harus segera diperbarui.