{i>Information architecture

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 Fungsi setelan dan implementasi yang lebih mudah.

Contoh dan sumber

Sebagian besar halaman di Setelan saat ini diimplementasikan 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 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 bergaya 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 bergaya 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>. 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 elemen eksternal atau internal Aktivitas. Biasanya, intent ini mengarah ke halaman setelan yang berbeda. Misalnya, "Google" item setelan di 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 yang dikonfigurasi secara statis setelan, jadi biasanya developer harus menerapkan setelan tersebut sebagai setelan statis. Namun, setelan dinamis dapat berguna jika salah satu hal berikut berlaku:

  • 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 kategorinya. Kategori adalah konstanta, yang ditentukan di CategoryKey.
  • Opsional: Tambahkan teks ringkasan saat setelan ditampilkan.

Berikut adalah 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. Baik PreferenceController ditentukan dalam kode Java atau dalam XML, DashboardFragment mengelola logika penanganan setiap setelan melalui PreferenceController (dibahas di bawah). Kemudian, data tersebut ditampilkan di UI sebagai daftar campuran.

PreferenceController

Ada 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, memperbarui, pengindeksan penelusuran, 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 {i>default<i}. Misalnya, TogglePreferenceController memiliki API yang langsung memetakan cara 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 melampirkan PreferenceController sebelum waktu tampilan. Pada waktu penginstalan, pengontrol dihubungkan ke fragmen sehingga semua peristiwa relevan mendatang 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 dalam rilis Android 8.x

PreferenceController berisi semua logika untuk berinteraksi dengan preferensi, termasuk menampilkan, memperbarui, pengindeksan penelusuran, 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

Memindahkan preferensi dari halaman A ke B

Jika preferensi tercantum secara statis dalam file XML preferensi halaman asli, ikuti prosedur pemindahan Statis untuk rilis Android Anda di bawah. Jika tidak, ikuti prosedur pemindahan Dinamis untuk rilis Android Anda.

Gerakan statis di Android 9

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

    Catatan: Preferensi mungkin tidak memiliki PreferenceController.

  5. Buat instance PreferenceController di elemen createPreferenceControllers(). Jika PreferenceController ditentukan dalam XML di halaman lama, tentukan dalam XML untuk halaman baru juga.

Gerakan dinamis di Android 9

  1. Temukan kategori yang dihosting halaman asli dan tujuan. Anda dapat temukan informasi ini di DashboardFragmentRegistry.
  2. Buka file AndroidManifest.xml yang berisi setelan yang perlu Anda ubah dan temukan entri Aktivitas yang mewakili setelan ini.
  3. Tetapkan 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() halaman.
  3. Hapus preferensi di XML halaman asli.
  4. Tambahkan preferensi ke XML halaman tujuan.
  5. Hapus PreferenceController untuk preferensi ini di implementasi Java halaman asli. Biasanya dalam getPreferenceControllers().
  6. Catatan: Preferensi mungkin tidak memiliki PreferenceController.

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

Pemindahan dinamis dalam rilis Android 8.x

  1. Temukan kategori yang dihosting oleh halaman asli dan tujuan. Anda dapat menemukan informasi ini di DashboardFragmentRegistry.
  2. Buka file AndroidManifest.xml yang berisi setelan yang perlu Anda ubah dan temukan entri Aktivitas yang mewakili setelan ini.
  3. 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 XML preferensi halaman asli ikuti prosedur statis di bawah ini. Atau, ikuti dinamis.

Membuat preferensi statis

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

      Jika preferensi ini sudah ada di tempat lain, mungkin sudah ada PreferenceController untuk preferensi tersebut. Anda dapat menggunakan kembali PreferenceController 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"/>

Membuat preferensi dinamis

  1. Temukan kategori 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 setelan. 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 bersifat opsional. Jika Anda tidak memerlukan preferensi dinamis di halaman ini, Anda tidak perlu memberikan kunci kategori.

  3. Ikuti langkah-langkah untuk menambahkan setelan yang diperlukan untuk halaman ini. Untuk selengkapnya informasi selengkapnya, lihat bagian Penerapan.

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.