Bilgi mimarisi

Android 8.0, 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 Ayarlar uygulaması için yeni bir bilgi mimarisini kullanıma sundu. Android 9, daha fazla Ayarlar işlevi ve daha kolay uygulama sağlamak için bazı iyileştirmeler sundu.

Örnekler ve kaynak

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

Önemli bileşenlere ait 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 sunulmuştur): packages/apps/Settings/src/com/android/settings/core/BasePreferenceController.java

Uygulama

Cihaz üreticilerinin mevcut Ayarlar bilgi mimarisini uyarlamaları ve iş ortaklarına özgü özellikleri karşılamak 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, muhtemelen PreferenceController ile uygulanmaz.

Bu nedenle, bir tercihleri eski bir sayfadan yeni bir sayfaya taşırken, bir PreferenceController oluşturmanız ve yeni DashboardFragment uygulamasında tetiklemeden önce kodu denetleyiciye taşımanız gerekir. PreferenceController için gereken API'ler adlarında açıklanmıştır ve Javadoc'ta belgelenir.

Her PreferenceController için bir birim testi eklemeniz önemle tavsiye edilir. Değişiklik AOSP'ye gönderilirse bir birim testi yapılması gerekir. Robolectric tabanlı testlerin nasıl yazılacağı hakkında daha fazla bilgi için beni okuma dosyasına packages/apps/Settings/tests/robotests/README.md bakın.

Eklenti tarzı bilgi mimarisi

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

Birden fazla ayarın taşınmasını kolaylaştırmak için Android 8.0, ayar öğelerini içeren eklenti tarzı bir ana makine parçasını kullanıma sundu. Ayar öğeleri, eklenti tarzı denetleyiciler olarak modellenir. Dolayısıyla, ayarlar sayfası tek bir ana makine parçası ve birden fazla ayar denetleyicisi tarafından oluşturulur.

Kontrol Paneli Parçası

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

Statik tercihler

Statik tercih listesi, XML'de <Preference> etiketi kullanılarak tanımlanır. DashboardFragment uygulaması, hangi XML dosyasının görüntülenecek statik tercih listesini içerdiğini tanımlamak için getPreferenceScreenResId() yöntemini kullanır.

Dinamik tercihler

Dinamik öğe, amaca yönelik bir bloku temsil eder ve harici veya dahili etkinliğe yol açar. Amaç genellikle farklı bir ayar sayfasına yönlendirir. Örneğin, Ayarlar ana sayfasındaki "Google" ayar öğesi dinamik bir öğedir. Dinamik öğeler, AndroidManifest bölümünde 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, normalde geliştiriciler bu ayarı statik olarak uygulamalıdır. Ancak dinamik ayar, aşağıdakilerden herhangi biri doğru olduğunda yararlı olabilir:

  • Bu ayar doğrudan Ayarlar uygulamasında uygulanmaz (ör. OEM/Operatör uygulamaları tarafından uygulanan bir ayarı yerleştirme).
  • İlgili ayar, Ayarlar ana sayfasında görünecektir.
  • 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 intent filtresi ekleyerek etkinliği dinamik ayar olarak işaretleyin.
  • Ayarlar uygulamasına hangi kategoriye ait olduğunu söyleyin. Kategori sabittir ve CategoryKey ile tanımlanır.
  • İsteğe bağlı: Ayar görüntülenirken özet metni ekleyin.

DisplaySettings için Ayarlar uygulamasından alınan bir örneği burada bulabilirsiniz.

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

Parça, oluşturma sırasında hem statik XML'den hem de AndroidManifest içinde tanımlanan dinamik ayarlardan Tercihler listesi ister. PreferenceController'ler ister Java kodunda ister XML'de tanımlanmış olsun, DashboardFragment her ayarın işleme mantığını PreferenceController üzerinden yönetir (aşağıda açıklanmıştır). Daha sonra, kullanıcı arayüzünde karma bir liste olarak görüntülenirler.

PreferenceController

Bu bölümde açıklandığı gibi, PreferenceController uygulamasının Android 9 ve Android 8.x sürümünde uygulanması arasında farklılıklar vardır.

Android 9 sürümünde PreferenceController

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

PreferenceController öğesinin arayüzü BasePreferenceController olarak tanımlanır. Örneğin, packages/apps/Settings/src/com/android/settings/core/ BasePreferenceController.java adresindeki koda bakın

BasePreferenceController kapsamında, her biri Ayarlar uygulamasının varsayılan olarak desteklediği belirli bir kullanıcı arayüzü stiliyle eşlenen birkaç alt sınıf bulunur. Örneğin TogglePreferenceController, kullanıcının açma/kapatma tabanlı tercih kullanıcı arayüzüyle nasıl etkileşimde bulunması gerektiğiyle doğrudan eşlenen bir API'ye sahiptir.

BasePreferenceController; getAvailabilityStatus(), displayPreference(), handlePreferenceTreeClicked(), gibi API'lere sahiptir. Her API'ye ilişkin ayrıntılı belgeler arayüz sınıfındadır.

BasePreferenceController (ve TogglePreferenceController gibi alt sınıflarının) uygulanmasına ilişkin bir kısıtlama, oluşturucu imzasının aşağıdakilerden biriyle eşleşmesi gerektiğidir:

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

Parçaya bir tercih yüklenirken kontrol paneli, görüntüleme zamanından önce PreferenceController ekleme yöntemi sağlar. Yükleme sırasında denetleyici, parçaya bağlanır. Böylece gelecekteki tüm alakalı etkinlikler denetleyiciye gönderilir.

DashboardFragment, PreferenceController'ların listesini ekranda tutar. Parçanın onCreate() konumunda tüm denetleyiciler, getAvailabilityStatus() yöntemi için çağrılır. true (doğru) değerini döndürürse displayPreference(), görüntüleme mantığını işlemek için çağrılır. getAvailabilityStatus(), Ayarlar çerçevesine arama sırasında hangi öğelerin kullanılabileceğini bildirmek için 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şimde bulunacak tüm mantığı içerir.

Tercih etkileşimlerine karşılık olarak, PreferenceController arayüzünde isAvailable(), displayPreference(), handlePreferenceTreeClicked() vb. API'ler bulunur. Her bir API ile ilgili ayrıntılı belgeler arayüz sınıfında bulunabilir.

Parçaya bir tercih yüklenirken kontrol paneli, görüntüleme zamanından önce PreferenceController ekleme yöntemi sağlar. Yükleme sırasında denetleyici, parçaya bağlanır. Böylece gelecekteki tüm alakalı etkinlikler denetleyiciye gönderilir.

DashboardFragment, PreferenceControllers listesini ekranda tutar. Parçanın onCreate() konumunda, tüm denetleyiciler isAvailable() yöntemi için çağrılır. true değeri döndürülü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 aşağıdaki Android sürümünüz için 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. Orijinal sayfanın Java uygulamasından bu tercihe ait PreferenceController değerini kaldırın. Bu, genellikle createPreferenceControllers() olur. Denetleyici doğrudan XML'de tanımlanabilir.

    Not: Tercihte PreferenceController olmayabilir.

  5. Hedef sayfanın createPreferenceControllers() bölümünde PreferenceController öğesini örneklendirin. PreferenceController eski sayfada XML olarak tanımlanırsa bunu yeni sayfa için XML olarak da tanımlayın.

Android 9'da dinamik taşıma

  1. Orijinal ve hedef sayfanın barındırdığı kategoriyi bulun. Bu bilgileri DashboardFragmentRegistry bölümünde bulabilirsiniz.
  2. Taşımanız gereken 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. Orijinal sayfanın XML'sindeki tercihi kaldırın.
  4. Tercihi, hedef sayfanın XML'sine ekleyin.
  5. Orijinal sayfanın Java uygulamasında bu tercihe ait PreferenceController değerini kaldırın. Genellikle getPreferenceControllers() olur.
  6. Not: Tercihte PreferenceController olmayabilir.

  7. Hedef sayfanın getPreferenceControllers() bölümünde PreferenceController öğesini örneklendirin.

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

  1. Orijinal ve hedef sayfanın barındırdığı kategoriyi bulun. Bu bilgileri DashboardFragmentRegistry bölümünde bulabilirsiniz.
  2. Taşımanız gereken 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.

Bir sayfada yeni 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. Sayfa için tercih edilen XML dosyalarını bulun. Bu bilgileri sayfanın getPreferenceScreenResId() yönteminden bulabilirsiniz.
  2. XML'ye yeni bir Tercih öğesi ekleyin. Benzersiz bir android:key özelliğine 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 zaten PreferenceController olabilir. Yeni bir kod oluşturmadan PreferenceController öğesini yeniden kullanabilirsiniz.

    • Android 9'dan itibaren tercihin yanında PreferenceController öğesini XML olarak belirtmeyi 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 barındırdığı kategoriyi bulun. Bu bilgileri DashboardFragmentRegistry bölümünde bulabilirsiniz.
  2. AndroidManifest içinde yeni bir Etkinlik oluşturun
  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ğere ayarlayın.

Yeni sayfa oluştur

  1. DashboardFragment kaynağından devralan yeni bir parça oluşturun.
  2. Kategorisini DashboardFragmentRegistry kullanarak 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üne bakın.

Doğrulama

  • Ayarlar'da robolektrik testleri yapın. Mevcut ve yeni tüm testler başarılı olacaktır.
  • Ayarları oluşturun ve yükleyin, ardından değiştirilen sayfayı manuel olarak açın. Sayfa hemen güncellenir.