Google berkomitmen untuk mendorong terwujudnya keadilan ras bagi komunitas Kulit Hitam. Lihat caranya.

Arsitektur Informasi

Android 8.0 memperkenalkan arsitektur informasi baru untuk aplikasi Pengaturan untuk 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 fungsionalitas 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 memasukkan halaman pengaturan tambahan yang diperlukan untuk mengakomodasi fitur khusus mitra. Memindahkan preferensi dari halaman lama (diimplementasikan sebagai SettingsPreferencePage ) ke halaman baru (diimplementasikan menggunakan DashboardFragment ) bisa jadi rumit. Preferensi dari halaman lama kemungkinan besar 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 di DashboardFragment baru. API yang dibutuhkan PreferenceController dijelaskan dalam namanya dan didokumentasikan di Javadoc.

Sangat disarankan untuk menambahkan pengujian unit untuk setiap PreferenceController . Jika perubahan tersebut dikirim ke AOSP, maka tes unit diperlukan. Untuk mendapatkan informasi lebih lanjut tentang cara menulis pengujian berbasis Robolectric, lihat packages/apps/Settings/tests/robotests/README.md 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 lain.

Untuk mempermudah perpindahan beberapa pengaturan, Android 8.0 memperkenalkan fragmen host bergaya plugin yang berisi item pengaturan. Item pengaturan dimodelkan sebagai pengontrol gaya plugin. Karenanya, halaman pengaturan dibuat oleh satu fragmen host dan beberapa pengontrol pengaturan.

DashboardFragment

DashboardFragment adalah host dari pengontrol preferensi gaya plugin. Fragmen ini diturunkan dari PreferenceFragment dan memiliki kait 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 statis preferensi untuk ditampilkan.

Preferensi dinamis

Item dinamis merepresentasikan petak dengan maksud, yang mengarah ke Aktivitas eksternal atau internal. Biasanya, maksud tersebut 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 hal berikut ini benar:

  • Setelan tidak langsung diterapkan di aplikasi Setelan (seperti memasukkan setelan yang diterapkan oleh aplikasi OEM / Operator).
  • Pengaturan akan muncul di beranda Pengaturan.
  • Anda sudah memiliki Aktivitas untuk setelan tersebut dan tidak ingin mengimplementasikan konfigurasi statis tambahan.

Untuk mengonfigurasi Aktivitas sebagai pengaturan dinamis, lakukan hal berikut:

  • Tandai aktivitas sebagai pengaturan dinamis dengan menambahkan filter-maksud ke aktivitas.
  • Beri tahu aplikasi Pengaturan kategori mana yang dimilikinya. Kategorinya adalah konstanta, ditentukan dalam CategoryKey .
  • Opsional: Tambahkan teks ringkasan saat pengaturan 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 perenderan, fragmen akan meminta daftar Preferensi dari XML statis dan setelan dinamis yang ditentukan di AndroidManifest . Baik PreferenceController ditentukan dalam kode Java atau XML, DashboardFragment mengelola logika penanganan setiap setelan melalui PreferenceController (dibahas di bawah). Kemudian mereka ditampilkan di UI sebagai daftar campuran.

PreferenceController

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, mencari pengindeksan, 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 aplikasi Pengaturan secara default. Misalnya, TogglePreferenceController memiliki API yang secara langsung memetakan bagaimana pengguna harus berinteraksi dengan UI preferensi berbasis sakelar.

BasePreferenceController memiliki API seperti getAvailabilityStatus() , displayPreference() , handlePreferenceTreeClicked(), dll. Dokumentasi terperinci 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 memasang PreferenceController sebelum waktu tampilan. Pada waktu penginstalan, pengontrol disambungkan ke fragmen sehingga semua peristiwa relevan di masa mendatang dikirim ke pengontrol.

DashboardFragment menyimpan daftar PreferenceController di layar. Di onCreate() fragmen, semua pengontrol dipanggil untuk metode getAvailabilityStatus() , dan jika mengembalikan true, displayPreference() dipanggil untuk memproses logika tampilan. getAvailabilityStatus() juga penting untuk memberi tahu framework Pengaturan item mana yang tersedia selama pencarian.

PreferenceController dalam rilis Android 8.x.

PreferenceController berisi semua logika untuk berinteraksi dengan preferensi, termasuk menampilkan, memperbarui, mengindeks pencarian. dll.

Sesuai dengan interaksi preferensi, antarmuka PreferenceController memiliki API isAvailable() , displayPreference() , handlePreferenceTreeClicked() dll. Dokumentasi terperinci tentang setiap API dapat ditemukan di kelas antarmuka.

Saat memasang preferensi ke fragmen, dasbor menyediakan metode untuk memasang PreferenceController sebelum waktu tampilan. Pada waktu penginstalan, pengontrol disambungkan ke fragmen sehingga semua peristiwa relevan di masa mendatang dikirim ke pengontrol.

DashboardFragment menyimpan daftar PreferenceControllers di layar. Di onCreate() fragmen, semua pengontrol dipanggil untuk metode isAvailable() , dan jika mengembalikan true, displayPreference() dipanggil untuk memproses logika tampilan.

Menggunakan DashboardFragment

Memindahkan preferensi dari halaman A ke B

Jika preferensi dicantumkan secara statis dalam 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.

Langkah statis di Android 9

  1. Temukan file XML preferensi untuk halaman asli dan halaman tujuan. Anda dapat menemukan informasi ini dari metode getPreferenceScreenResId() .
  2. Hapus preferensi dari XML halaman asli.
  3. Tambahkan preferensi ke XML halaman tujuan.
  4. Hapus PreferenceController untuk preferensi ini dari implementasi Java di halaman asli. Biasanya ada di createPreferenceControllers() . Pengontrol mungkin dideklarasikan dalam XML secara langsung.

    Catatan : Preferensi mungkin tidak memiliki PreferenceController .

  5. createPreferenceControllers() PreferenceController di halaman tujuan createPreferenceControllers() . Jika PreferenceController didefinisikan dalam XML di halaman lama, tentukan juga dalam XML untuk halaman baru.

Gerakan dinamis di Android 9

  1. Temukan kategori mana yang dihosting halaman asli dan tujuan. Anda dapat menemukan informasi ini di DashboardFragmentRegistry .
  2. Buka file AndroidManifest.xml yang berisi setelan yang perlu Anda pindahkan dan temukan entri Aktivitas yang mewakili setelan ini.
  3. Setel nilai metadata aktivitas untuk com.android.settings.category ke kunci kategori halaman baru.

Pemindahan statis dalam rilis Android 8.x.

  1. Temukan file XML preferensi untuk halaman asli dan halaman tujuan.
  2. Anda dapat menemukan informasi ini dari metode getPreferenceScreenResId() .
  3. Hapus preferensi di XML halaman asli.
  4. Tambahkan preferensi ke XML halaman tujuan.
  5. Hapus PreferenceController untuk preferensi ini dalam implementasi Java di halaman asli. Biasanya ada di getPreferenceControllers() .
  6. Catatan : Ada kemungkinan preferensi tidak memiliki PreferenceController .

  7. getPreferenceControllers() PreferenceController di getPreferenceControllers() halaman tujuan.

Gerakan dinamis dalam rilis Android 8.x.

  1. Temukan kategori mana yang dihosting halaman asli dan tujuan. Anda dapat menemukan informasi ini di DashboardFragmentRegistry .
  2. Buka file AndroidManifest.xml yang berisi setelan yang perlu Anda pindahkan dan temukan entri Aktivitas yang mewakili setelan ini.
  3. Ubah nilai metadata aktivitas untuk com.android.settings.category , setel titik nilai ke kunci kategori halaman baru.

Membuat preferensi baru di halaman

Jika preferensi dicantumkan secara statis di file XML preferensi halaman asli, ikuti prosedur statis di bawah ini. Jika tidak, ikuti prosedur dinamis .

Membuat preferensi statis

  1. Temukan file XML preferensi untuk halaman tersebut. Anda dapat menemukan informasi ini dari metode getPreferenceScreenResId () halaman.
  2. Tambahkan item Preferensi baru di XML. Pastikan itu memiliki android:key unik.
  3. Tentukan PreferenceController untuk preferensi ini dalam metode getPreferenceControllers() .
    • Di Android 8.x dan secara opsional di Android 9, buat instance PreferenceController untuk preferensi ini dalam metode createPreferenceControllers() .

      Jika preferensi ini sudah ada di tempat lain, kemungkinan sudah ada PreferenceController untuk itu. Anda dapat menggunakan kembali PreferenceController tanpa membuat yang baru.

    • Mulai Android 9, Anda bisa 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"/>
      

Membuat preferensi dinamis

  1. Temukan kategori mana yang dihosting halaman asli dan tujuan. Anda dapat menemukan informasi ini di DashboardFragmentRegistry .
  2. Buat Aktivitas baru di AndroidManifest
  3. Tambahkan metadata yang diperlukan ke Aktivitas baru untuk menentukan pengaturan. Setel nilai metadata untuk com.android.settings.category ke nilai yang sama yang ditentukan di langkah 1.

Buat halaman baru

  1. Buat fragmen baru, yang mewarisi dari DashboardFragment .
  2. Tentukan kategorinya di DashboardFragmentRegistry .

    Catatan: Langkah ini opsional. Jika Anda tidak membutuhkan preferensi dinamis di halaman ini, Anda tidak perlu memberikan kunci kategori.

  3. Ikuti langkah-langkah untuk menambahkan pengaturan yang diperlukan untuk halaman ini. Untuk informasi lebih lanjut, lihat bagian Implementasi .

Validasi

  • Jalankan uji robolectric 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.