Android 8.0 memperkenalkan arsitektur informasi baru untuk aplikasi {i>Settings<i} untuk menyederhanakan cara pengaturan pengaturan dan memudahkan pengguna untuk menemukan setelan dengan cepat untuk menyesuaikan perangkat Android mereka. Android 9 memperkenalkan beberapa peningkatan untuk memberikan Fungsi setelan dan implementasi yang lebih mudah.
Contoh dan sumber
Sebagian besar halaman di Setelan saat ini diimplementasikan menggunakan framework baru. Bagus
contohnya 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
- AbstrakPreferenceController:
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 disarankan untuk menyesuaikan informasi Setelan yang sudah ada
arsitektur dan memasukkan halaman setelan tambahan
sesuai kebutuhan untuk mengakomodasi
fitur khusus partner. Memindahkan preferensi dari halaman lama (diterapkan sebagai
SettingsPreferencePage
) ke halaman baru (diterapkan menggunakan
DashboardFragment
) bisa menjadi rumit. Preferensi dari model
halaman lama kemungkinan tidak diterapkan dengan PreferenceController
.
Jadi, saat memindahkan preferensi dari halaman lama ke halaman baru, Anda perlu membuat
PreferenceController
dan pindahkan kode ke pengontrol sebelum
membuat instance di DashboardFragment
baru. API yang
Persyaratan PreferenceController
dijelaskan dalam namanya dan
yang didokumentasikan dalam Javadoc.
Sebaiknya tambahkan pengujian unit untuk setiap PreferenceController
.
Jika perubahan telah 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 gaya plugin
Setiap item setelan diterapkan sebagai Preferensi. Preferensi dapat dengan mudah dipindahkan dari satu halaman ke halaman lain.
Untuk memudahkan pemindahan beberapa setelan, Android 8.0 memperkenalkan fragmen {i>host<i} bergaya plugin yang berisi item setelan. Item setelan adalah dimodelkan sebagai pengontrol gaya plugin. Oleh karena itu, halaman setelan dibuat oleh fragmen {i>host<i} tunggal dan beberapa pengontrol setelan.
DashboardFragment
DashboardFragment
adalah host pengontrol preferensi gaya plugin.
Fragmen 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>
. J
Implementasi DashboardFragment
menggunakan
Metode getPreferenceScreenResId()
untuk menentukan file XML yang berisi
daftar preferensi statis yang akan ditampilkan.
Preferensi dinamis
Item dinamis mewakili kartu dengan intent, yang mengarah ke elemen eksternal atau internal
Aktivitas. Biasanya, intent ini mengarah ke halaman setelan yang berbeda. Misalnya,
"Google" item setelan di beranda Setelan adalah item dinamis. Dinamis
item ditentukan di AndroidManifest
(dibahas di bawah) dan dimuat
melalui FeatureProvider
(ditetapkan sebagai
DashboardFeatureProvider
).
Setelan dinamis lebih berat daripada yang dikonfigurasi secara statis setelan, jadi biasanya developer harus menerapkan setelan tersebut sebagai setelan statis. Namun, setelan dinamis dapat berguna jika salah satu kondisi berikut terpenuhi:
- Setelan 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:
- Menandai aktivitas sebagai setelan dinamis dengan menambahkan filter intent ke aktivitas Anda.
- Beri tahu aplikasi Setelan kategori aplikasi tersebut. Kategori ini adalah konstanta,
ditentukan di
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 elemen
Setelan XML dan dinamis yang ditentukan di AndroidManifest
. Apakah
PreferenceController
ditentukan dalam kode Java atau XML,
DashboardFragment
mengelola logika penanganan setiap setelan
hingga PreferenceController
(dibahas di bawah). Kemudian mereka
ditampilkan di UI sebagai daftar campuran.
PengontrolPreferensi
Terdapat perbedaan antara penerapan PreferenceController
di Android 9 dan Android 8.x, seperti yang dijelaskan dalam
bagian.
Rilis PreferenceController di Android 9
PreferenceController
berisi semua logika untuk berinteraksi dengan
preferensi, termasuk menampilkan, memperbarui, menelusuri pengindeksan, dll.
Antarmuka PreferenceController
didefinisikan sebagai
BasePreferenceController
. Misalnya, lihat kode di
packages/apps/Settings/src/com/android/settings/core/
BasePreferenceController.java
Ada beberapa subclass BasePreferenceController
, masing-masing
memetakan ke gaya UI tertentu yang didukung aplikasi Setelan secara default. Sebagai
contoh, 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 masing-masing
API berada di class antarmuka.
Batasan pada penerapan BasePreferenceController
(dan
subclass-nya seperti TogglePreferenceController
) adalah bahwa
tanda tangan konstruktor harus cocok dengan salah satu hal berikut:
public MyController(Context context, String key) {}
public MyController(Context context) {}
Saat menginstal preferensi ke fragmen, dasbor menyediakan metode untuk
lampirkan PreferenceController
sebelum waktu tampilan. Pada waktu penginstalan,
pengontrol terhubung ke fragmen sehingga semua peristiwa relevan di masa mendatang
dikirim ke {i>controller<i}.
DashboardFragment
menyimpan daftar
PreferenceController
di layar. Di bagian
onCreate()
, semua pengontrol dipanggil untuk
getAvailabilityStatus()
, dan jika menampilkan benar,
displayPreference()
dipanggil untuk memproses logika tampilan.
getAvailabilityStatus()
juga penting untuk memberi tahu Setelan
kerangka kerja item yang
tersedia selama pencarian.
PreferenceController dalam rilis Android 8.x
PreferenceController
berisi semua logika untuk berinteraksi dengan
preferensi, termasuk menampilkan, memperbarui, pengindeksan pencarian. 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
lampirkan PreferenceController
sebelum waktu tampilan. Pada waktu penginstalan,
pengontrol terhubung ke fragmen sehingga semua peristiwa relevan di masa mendatang
dikirim ke {i>controller<i}.
DashboardFragment
menyimpan daftar PreferenceControllers
di layar. Di onCreate()
fragmen, semua
pengontrol akan dipanggil untuk metode isAvailable()
, dan jika
menampilkan benar (true), displayPreference()
dipanggil untuk memproses tampilan
logika.
Menggunakan DashboardFragment
Pindahkan preferensi dari halaman A ke B
Jika preferensi dicantumkan secara statis dalam XML preferensi halaman asli file, ikuti prosedur pemindahan Statis untuk Android Anda rilis di bawah ini. Jika tidak, ikuti prosedur pemindahan Dinamis untuk rilis Android Anda.
Gerakan statis di Android 9
- Temukan file XML preferensi untuk halaman dan tujuan asli
kami. Anda dapat menemukan informasi ini dari
Metode
getPreferenceScreenResId()
. - 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 mungkin dideklarasikan di XML secara langsung.Catatan: Preferensi mungkin tidak memiliki
PreferenceController
. - Buat instance
PreferenceController
di elemencreatePreferenceControllers()
. JikaPreferenceController
ditentukan dalam XML di halaman lama. Definisikan dalam XML untuk halaman baru juga.
Gerakan dinamis di Android 9
- Temukan kategori yang dihosting halaman asli dan tujuan. Anda dapat
temukan informasi ini di
DashboardFragmentRegistry
. - Buka file
AndroidManifest.xml
yang berisi setelan yang Anda memindahkan dan menemukan entri {i>Activity<i} yang mewakili setelan ini. - Tetapkan nilai metadata aktivitas untuk
com.android.settings.category
ke kunci kategori halaman baru.
Perpindahan 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 di implementasi Java halaman asli. Biasanya dalamgetPreferenceControllers()
. - Buat instance
PreferenceController
di elemengetPreferenceControllers()
.
getPreferenceScreenResId()
halaman.
Catatan: Preferensi mungkin tidak memiliki
PreferenceController
.
Pergerakan 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 Anda memindahkan dan menemukan entri {i>Activity<i} yang mewakili setelan ini. - Ubah nilai metadata aktivitas untuk
com.android.settings.category
, tetapkan nilai ke kunci kategori halaman baru.
Membuat preferensi baru di halaman
Jika preferensi dicantumkan secara statis dalam XML preferensi halaman asli ikuti prosedur statis di bawah ini. Atau, ikuti dinamis.
Membuat preferensi statis
- Temukan file XML preferensi untuk halaman tersebut. Anda dapat menemukan informasi ini dari metode getPreferenceScreenResId() halaman.
- Tambahkan item Preference baru dalam XML. Pastikan elemen tersebut memiliki
android:key
yang unik. -
Tentukan
PreferenceController
untuk preferensi ini di elemen MetodegetPreferenceControllers()
.- 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 ada sudah ada
PreferenceController
untuknya. Anda dapat menggunakan kembaliPreferenceController
tanpa membuat yang baru. -
Mulai Android 9, Anda dapat memilih untuk mendeklarasikan
PreferenceController
dalam XML di samping 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 secara opsional di Android 9,
buat instance
Membuat preferensi dinamis
- Temukan kategori 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, yang mewarisi dari
DashboardFragment
. - Tentukan kategorinya di
DashboardFragmentRegistry
.Catatan: Langkah ini bersifat opsional. Jika Anda 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 selengkapnya informasi selengkapnya, lihat bagian Penerapan.
Validasi
- Jalankan uji robolectric di Setelan. Semua pengujian yang ada dan yang baru harus lulus.
- Buat dan instal Setelan, lalu buka halaman yang sedang diubah secara manual. Halaman akan segera diperbarui.