Bilgi mimarisi

Android 8.0, Ayarlar uygulamasında ayarların düzenlenme şeklini basitleştirmek ve kullanıcıların Android cihazlarını özelleştirmek için ayarları hızlı bir şekilde bulmasını kolaylaştırmak amacıyla yeni bir bilgi mimarisi sunmuştur. Android 9, daha fazla Ayarlar işlevi ve daha kolay uygulama sağlamak için bazı iyileştirmeler sunar.

Örnekler ve kaynak

Ayarlar'daki çoğu sayfa şu anda yeni çerçeve kullanılarak uygulanmaktadır. İyi bir örnek DisplaySettings'tir: packages/apps/Settings/src/com/android/settings/DisplaySettings.java

Önemli bileşenlerin dosya yolları aşağıda listelenmiştir:

  • 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 (Android 9'da kullanıma sunuldu): packages/apps/Settings/src/com/android/settings/core/BasePreferenceController.java

Uygulama

Cihaz üreticilerinin, mevcut Ayarlar bilgi mimarisini uyarlamaları ve iş ortağına özel özellikleri desteklemek için gerektiğinde ek ayarlar sayfaları eklemeleri önerilir. Tercihleri eski sayfadan (SettingsPreferencePage olarak uygulanır) yeni bir sayfaya (DashboardFragment kullanılarak uygulanır) taşımak karmaşık olabilir. Eski sayfadaki tercih büyük olasılıkla PreferenceController ile uygulanmamıştır.

Bu nedenle, eski bir sayfadan yeni bir sayfaya tercih taşırken PreferenceController oluşturmanız ve kodu yeni DashboardFragment'de başlatmadan önce denetleyiciye taşımanız gerekir. PreferenceController gerektiren API'ler adlarında açıklanır ve Javadoc'ta belgelenir.

Her PreferenceController için bir birim testi eklemeniz önemle tavsiye edilir. Değişiklik AOSP'ye gönderilirse birim testi yapılması gerekir. Robolectric tabanlı testler yazma hakkında daha fazla bilgi edinmek için readme dosyasını packages/apps/Settings/tests/robotests/README.md inceleyin.

Eklenti tarzı bilgi mimarisi

Her ayar öğesi bir Tercih olarak uygulanır. Bir tercih kolayca bir sayfadan diğerine taşınabilir.

Android 8.0, birden fazla ayarın taşınmasını kolaylaştırmak için ayar öğelerini içeren eklenti tarzı bir ana makine parçası sunar. Ayarlar öğeleri, eklenti tarzı denetleyiciler olarak modellenir. Bu nedenle, ayarlar sayfası tek bir ana makine parçası ve birden fazla ayar denetleyicisi tarafından oluşturulur.

DashboardFragment

DashboardFragment, eklenti tarzı tercih denetleyicilerinin ana makinesidir. Parça, PreferenceFragment öğesinden devralınır ve hem statik tercih listelerini hem de dinamik tercih listelerini genişletip güncellemek için kancalara sahiptir.

Statik tercihler

Statik tercih listesi, <Preference> etiketi kullanılarak XML'de tanımlanır. Bir DashboardFragment uygulaması, gösterilecek statik tercih listesini içeren XML dosyasını tanımlamak için getPreferenceScreenResId() yöntemini kullanır.

Dinamik tercihler

Dinamik öğe, harici veya dahili bir etkinliğe yönlendiren, amaca yönelik bir kutuyu temsil eder. Genellikle amaç, farklı bir ayar sayfasına yönlendirmektir. Örneğin, Ayarlar ana sayfasındaki "Google" ayar öğesi dinamik bir öğedir. Dinamik öğeler, AndroidManifest içinde tanımlanır (aşağıda açıklanmıştır) ve FeatureProvider ( DashboardFeatureProvider olarak tanımlanır) aracılığıyla yüklenir.

Dinamik ayarlar, statik olarak yapılandırılmış ayarlardan daha ağırdır. Bu nedenle, geliştiriciler genellikle ayarı statik olarak uygulamalıdır. Ancak aşağıdaki durumlarda dinamik ayar yararlı olabilir:

  • Ayar doğrudan Ayarlar uygulamasında uygulanmıyordur (ör. OEM/operatör uygulamaları tarafından uygulanan bir ayarı yerleştirme).
  • Ayar, Ayarlar ana sayfasında görünmelidir.
  • Ayar için zaten bir etkinliğiniz var ve ek statik yapılandırmayı uygulamak istemiyorsunuz.

Bir etkinliği dinamik ayar olarak yapılandırmak için aşağıdakileri yapın:

  • Etkinliğe bir intent filtresi ekleyerek etkinliği dinamik ayar olarak işaretleyin.
  • Ayarlar uygulamasına hangi kategoriye ait olduğunu söyleyin. Kategori, CategoryKey içinde tanımlanan sabit bir değerdir.
  • İsteğe bağlı: Ayar gösterildiğinde özet metni ekleyin.

DisplaySettings için Ayarlar uygulamasından alınmış bir örneği aşağıda görebilirsiniz.

<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>

Oluşturma sırasında parça, hem statik XML'den hem de AndroidManifest içinde tanımlanan dinamik ayarlardan bir Tercihler listesi ister. PreferenceControllerJava kodunda veya XML'de tanımlanmış olsun, DashboardFragment her ayarın işleme mantığını PreferenceController aracılığıyla yönetir (aşağıda açıklanmıştır). Ardından, kullanıcı arayüzünde karma bir liste olarak gösterilir.

PreferenceController

Bu bölümde açıklandığı gibi, Android 9 ve Android 8.x'te PreferenceController uygulaması arasında farklılıklar vardır.

Android 9 sürümündeki PreferenceController

PreferenceController, görüntüleme, güncelleme, arama dizine ekleme vb. dahil olmak üzere tercihle etkileşim kurmak için gereken tüm mantığı içerir.

PreferenceController arayüzü BasePreferenceController olarak tanımlanır. Örneğin, aşağıdaki kodlara bakın: packages/apps/Settings/src/com/android/settings/core/ BasePreferenceController.java

BasePreferenceController'nın birkaç alt sınıfı vardır. Bunların her biri, Ayarlar uygulamasının varsayılan olarak desteklediği belirli bir kullanıcı arayüzü stiliyle eşlenir. Örneğin, TogglePreferenceController, kullanıcının açma/kapatma düğmesi tabanlı tercih kullanıcı arayüzüyle nasıl etkileşim kurması gerektiğini doğrudan eşleyen bir API'ye sahiptir.

BasePreferenceController, getAvailabilityStatus(), displayPreference(), handlePreferenceTreeClicked(), gibi API'lere sahiptir. Her API'nin ayrıntılı belgeleri arayüz sınıfındadır.

BasePreferenceController (ve TogglePreferenceController gibi alt sınıfları) uygulamasında, oluşturucu imzasının aşağıdakilerden biriyle eşleşmesi gerekir:

  • public MyController(Context context, String key) {}
  • public MyController(Context context) {}

Kontrol paneli, tercihi fragmana yüklerken görüntüleme süresinden önce PreferenceController ekleme yöntemi sunar. Yükleme sırasında, denetleyici parçaya bağlanır. Böylece gelecekteki tüm ilgili etkinlikler denetleyiciye gönderilir.

DashboardFragment, ekrandaki PreferenceController listesini tutar. Parçanın onCreate() bölümünde, getAvailabilityStatus() yöntemi için tüm denetleyiciler çağrılır ve bu yöntem doğru değerini döndürürse görüntüleme mantığını işlemek için displayPreference() çağrılır. getAvailabilityStatus(), arama sırasında hangi öğelerin kullanılabileceğini Ayarlar çerçevesine bildirmek de önemlidir.

Android 8.x sürümlerinde PreferenceController

PreferenceController, görüntüleme, güncelleme, arama dizine ekleme vb. dahil olmak üzere tercihle etkileşim kurmaya yönelik tüm mantığı içerir.

Tercih etkileşimlerine karşılık gelen PreferenceController arayüzünde isAvailable(), displayPreference(), handlePreferenceTreeClicked() gibi API'ler bulunur. Her API ile ilgili ayrıntılı belgeleri arayüz sınıfında bulabilirsiniz.

Kontrol paneli, tercihi fragmana yüklerken görüntüleme süresinden önce PreferenceController ekleme yöntemi sunar. Yükleme sırasında, denetleyici parçaya bağlanır. Böylece gelecekteki tüm ilgili etkinlikler denetleyiciye gönderilir.

DashboardFragment, ekranda PreferenceControllers listesini tutar. Parçanın onCreate() bölümünde, isAvailable() yöntemi için tüm denetleyiciler çağrılır ve doğru değer döndürürse görüntüleme mantığını işlemek için displayPreference() çağrılır.

DashboardFragment'ı kullanma

Bir tercihi A sayfasından B sayfasına taşıma

Tercih, orijinal sayfanın tercih XML dosyasında statik olarak listeleniyorsa Android sürümünüz için aşağıdaki Statik taşıma prosedürünü uygulayın. Aksi takdirde, Android sürümünüz için Dinamik taşıma prosedürünü uygulayın.

Android 9'da statik taşıma

  1. Orijinal sayfa ve hedef sayfa için tercih XML dosyalarını bulun. Bu bilgileri sayfanın getPreferenceScreenResId() yönteminden bulabilirsiniz.
  2. Tercihi orijinal sayfanın XML'sinden kaldırın.
  3. Tercihi hedef sayfanın XML'sine ekleyin.
  4. Bu tercih için PreferenceController öğesini orijinal sayfanın Java uygulamasından kaldırın. Genellikle createPreferenceControllers() içinde yer alır. Denetleyici doğrudan XML'de tanımlanabilir.

    Not: Tercihin PreferenceController olmayabilir.

  5. Hedef sayfanın PreferenceController içinde createPreferenceControllers() öğesini oluşturun. PreferenceController eski sayfadaki XML'de tanımlanmışsa yeni sayfanın XML'sinde de tanımlayın.

Android 9'da dinamik taşıma

  1. Orijinal ve hedef sayfanın hangi kategoride barındırıldığını öğrenin. Bu bilgileri DashboardFragmentRegistry bölümünde bulabilirsiniz.
  2. Taşımak istediğiniz ayarı içeren AndroidManifest.xml dosyasını açın ve bu ayarı temsil eden Etkinlik girişini bulun.
  3. com.android.settings.category için etkinliğin meta veri değerini yeni sayfanın kategori anahtarına ayarlayın.

Android 8.x sürümlerinde statik taşıma

  1. Orijinal sayfa ve hedef sayfa için tercih XML dosyalarını bulun.
  2. Bu bilgileri sayfanın getPreferenceScreenResId() yönteminden bulabilirsiniz.
  3. Tercihi orijinal sayfanın XML'sinden kaldırın.
  4. Tercihi hedef sayfanın XML'sine ekleyin.
  5. Orijinal sayfanın Java uygulamasında bu tercihin PreferenceController öğesini kaldırın. Genellikle getPreferenceControllers() içinde yer alır.
  6. Not: Tercihin PreferenceController olmayabilir.

  7. Hedef sayfanın PreferenceController içinde getPreferenceControllers() öğesini oluşturun.

Android 8.x sürümlerinde dinamik taşıma

  1. Orijinal ve hedef sayfanın hangi kategoride barındırıldığını öğrenin. Bu bilgileri DashboardFragmentRegistry adresinde bulabilirsiniz.
  2. Taşımak istediğiniz ayarı içeren AndroidManifest.xml dosyasını açın ve bu ayarı temsil eden Etkinlik girişini bulun.
  3. com.android.settings.category için etkinliğin meta veri değerini değiştirin, değer noktasını yeni sayfanın kategori anahtarına ayarlayın.

Sayfada yeni bir tercih oluşturma

Tercih, orijinal sayfanın tercih XML dosyasında statik olarak listeleniyorsa aşağıdaki statik prosedürü uygulayın. Aksi takdirde dinamik prosedürü uygulayın.

Statik tercih oluşturma

  1. Sayfanın tercih XML dosyalarını bulun. Bu bilgiyi sayfanın getPreferenceScreenResId() yönteminden bulabilirsiniz.
  2. XML'ye yeni bir Tercih öğesi ekleyin. Benzersiz bir android:key'ya sahip olduğundan emin olun.
  3. Sayfanın getPreferenceControllers() yönteminde bu tercih için bir PreferenceController tanımlayın.
    • Android 8.x'te ve isteğe bağlı olarak Android 9'da, sayfanın createPreferenceControllers() yönteminde bu tercih için bir PreferenceController oluşturun.

      Bu tercih başka yerlerde zaten varsa PreferenceController için daha önce oluşturulmuş bir PreferenceController olabilir. Yeni bir PreferenceController oluşturmadan mevcut olanı yeniden kullanabilirsiniz.

    • Android 9'dan itibaren, tercihin yanındaki XML'de PreferenceController öğesini bildirmeyi seçebilirsiniz. Örneğin:
      <Preference
              android:key="reset_dashboard"
              android:title="@string/reset_dashboard_title"
              settings:controller="com.android.settings.system.ResetPreferenceController"/>

Dinamik tercih oluşturma

  1. Orijinal ve hedef sayfanın hangi kategoride barındırıldığını öğrenin. Bu bilgileri DashboardFragmentRegistry adresinde bulabilirsiniz.
  2. AndroidManifest içinde yeni bir etkinlik oluşturma
  3. Ayarı tanımlamak için yeni etkinliğe gerekli meta verileri ekleyin. com.android.settings.category için meta veri değerini 1. adımda tanımlanan değerle aynı olacak şekilde ayarlayın.

Yeni sayfa oluştur

  1. DashboardFragment öğesinden devralan yeni bir parça oluşturun.
  2. DashboardFragmentRegistry içinde kategorisini tanımlayın.

    Not: Bu adım isteğe bağlıdır. Bu sayfada herhangi bir dinamik tercihe ihtiyacınız yoksa kategori anahtarı sağlamanız gerekmez.

  3. Bu sayfa için gereken ayarları ekleme adımlarını uygulayın. Daha fazla bilgi için Uygulama bölümünü inceleyin.

Doğrulama

  • Ayarlar'da Robolectric testlerini çalıştırın. Mevcut ve yeni tüm testler başarılı olmalıdır.
  • Ayarları oluşturup yükleyin, ardından değiştirilen sayfayı manuel olarak açın. Sayfa hemen güncellenir.