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ızla bulmasını kolaylaştırmak amacıyla Ayarlar uygulamasına yönelik yeni bir bilgi mimarisi sundu. Android 9, daha fazla Ayarlar işlevselliği 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. Bunun iyi bir örneği 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 tanıtıldı): 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 ayar sayfaları eklemeleri teşvik edilmektedir. 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.

Dolayısıyla, bir tercihi eski bir sayfadan yeni bir sayfaya taşırken, bir PreferenceController oluşturmanız ve kodu yeni DashboardFragment başlatmadan önce denetleyiciye taşımanız gerekir. PreferenceController gerektirdiği API'ler adlarında açıklanmış ve Javadoc'ta belgelenmiştir.

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ı testlerin nasıl yazılacağı hakkında daha fazla bilgi almak için packages/apps/Settings/tests/robotests/README.md bakın.

Eklenti tarzı bilgi mimarisi

Her ayar öğesi bir Tercih olarak uygulanır. Bir Tercih kolaylıkla bir sayfadan diğerine 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 bilgisayar parçası sundu. Ayarlar öğeleri eklenti tarzı denetleyiciler olarak modellenmiştir. Bu nedenle, bir ayarlar sayfası tek bir ana bilgisayar parçası ve birden fazla ayar denetleyicisi tarafından oluşturulur.

Kontrol Paneli Parçası

DashboardFragment , eklenti tarzı tercih denetleyicilerinin ana bilgisayarıdır. Parça, PreferenceFragment miras alır ve hem statik tercih listelerini hem de dinamik tercih listelerini genişletmek ve güncellemek için kancalara sahiptir.

Statik tercihler

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

Dinamik tercihler

Dinamik bir öğe, harici veya dahili bir Etkinliğe yol açan, amacı olan bir kutucuğu temsil eder. Genellikle amaç farklı bir ayar sayfasına yönlendirir. Örneğin, Ayarlar ana sayfasındaki "Google" ayar öğesi dinamik bir öğedir. Dinamik öğeler AndroidManifest tanımlanır (aşağıda tartışılmıştır) ve bir 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ştiricilerin ayarı statik bir ayar olarak uygulaması gerekir. Ancak aşağıdakilerden herhangi biri doğru olduğunda dinamik ayar yararlı olabilir:

  • Ayar, doğrudan Ayarlar uygulamasında uygulanmaz (örneğin, OEM/Carrier uygulamaları tarafından uygulanan bir ayarın enjekte edilmesi).
  • Ayar, Ayarlar ana sayfasında görünmelidir.
  • Ayar için zaten bir Etkinliğiniz var ve ekstra 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 amaç filtresi ekleyerek etkinliği dinamik bir ayar olarak işaretleyin.
  • Ayarlar uygulamasına hangi kategoriye ait olduğunu söyleyin. Kategori, CategoryKey tanımlanan bir sabittir.
  • İsteğe bağlı: Ayar görüntülendiğinde özet metni ekleyin.

İşte DisplaySettings için Ayarlar uygulamasından alınan bir örnek.

<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, AndroidManifest tanımlanan hem statik XML hem de dinamik ayarlardan bir Tercihler listesi isteyecektir. PreferenceController ister Java kodunda ister XML'de tanımlanmış olsun, DashboardFragment her ayarın işleme mantığını PreferenceController (aşağıda tartışılmıştır) aracılığıyla yönetir. Daha sonra kullanıcı arayüzünde karışık bir liste olarak görüntülenirler.

Tercih Denetleyicisi

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

Android 9 sürümünde PreferenceController

Bir PreferenceController , görüntüleme, güncelleme, arama indeksleme vb. dahil olmak üzere tercihle etkileşime girecek tüm mantığı içerir.

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

BasePreferenceController birkaç alt sınıfı vardır ve her biri Ayarlar uygulamasının varsayılan olarak desteklediği belirli bir kullanıcı arayüzü stiliyle eşleşir. Örneğin, TogglePreferenceController kullanıcının geçiş tabanlı tercih kullanıcı arayüzüyle nasıl etkileşimde bulunması gerektiğini doğrudan eşleştiren bir API'ye sahiptir.

BasePreferenceController getAvailabilityStatus() , displayPreference() , handlePreferenceTreeClicked(), Her API için 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, yapıcı 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üklerken kontrol paneli, görüntüleme zamanından önce bir PreferenceController eklemek için bir yöntem sağlar. Kurulum sırasında denetleyici parçaya bağlanır, böylece gelecekteki tüm ilgili olaylar denetleyiciye gönderilir.

DashboardFragment ekranda PreferenceController bir listesini tutar. Parçanın onCreate() konumunda, getAvailabilityStatus() yöntemi için tüm denetleyiciler çağrılır ve true değerini döndürürse, görüntüleme mantığını işlemek için displayPreference() çağrılır. getAvailabilityStatus() aynı zamanda Ayarlar çerçevesine arama sırasında hangi öğelerin mevcut olduğunu bildirmek açısından da önemlidir.

Android 8.x sürümlerinde PreferenceController

Bir PreferenceController , görüntüleme, güncelleme, arama indeksleme dahil olmak üzere tercihle etkileşime girecek tüm mantığı içerir. vesaire.

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

Parçaya bir tercih yüklerken kontrol paneli, görüntüleme zamanından önce bir PreferenceController eklemek için bir yöntem sağlar. Kurulum sırasında denetleyici parçaya bağlanır, böylece gelecekteki tüm ilgili olaylar denetleyiciye gönderilir.

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

DashboardFragment'i 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üze yönelik Statik taşıma prosedürünü izleyin. Aksi takdirde, Android sürümünüz için Dinamik taşıma prosedürünü izleyin.

Android 9'da statik hareket

  1. Orijinal sayfa ve hedef sayfa için tercih XML dosyalarını bulun. Bu bilgiyi sayfanın getPreferenceScreenResId() yönteminden bulabilirsiniz.
  2. Tercihi orijinal sayfanın XML'inden kaldırın.
  3. Tercihi hedef sayfanın XML'sine ekleyin.
  4. Bu tercih için PreferenceController orijinal sayfanın Java uygulamasından kaldırın. Genellikle createPreferenceControllers() içindedir. Denetleyici doğrudan XML'de bildirilebilir.

    Not : Tercihte PreferenceController olmayabilir.

  5. Hedef sayfanın createPreferenceControllers() dosyasında PreferenceController örneğini oluşturun. PreferenceController eski sayfada XML'de tanımlanmışsa, onu yeni sayfa için de XML'de tanımlayın.

Android 9'da dinamik hareket

  1. Orijinal ve hedef sayfanın hangi kategoriyi barındırdığını bulun. Bu bilgiyi DashboardFragmentRegistry 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. Etkinliğin com.android.settings.category meta veri değerini yeni sayfanın kategori anahtarına ayarlayın.

Android 8.x sürümlerinde statik hareket

  1. Orijinal sayfa ve hedef sayfa için tercih XML dosyalarını bulun.
  2. Bu bilgiyi sayfanın getPreferenceScreenResId() yönteminden bulabilirsiniz.
  3. Orijinal sayfanın XML'indeki tercihi kaldırın.
  4. Tercihi hedef sayfanın XML'sine ekleyin.
  5. Orijinal sayfanın Java uygulamasında bu tercih için PreferenceController kaldırın. Genellikle getPreferenceControllers() içindedir.
  6. Not : Tercihin bir PreferenceController sahip olmaması mümkündür.

  7. Hedef sayfanın getPreferenceControllers() öğesinde PreferenceController örneğini oluşturun.

Android 8.x sürümlerinde dinamik hareket

  1. Orijinal ve hedef sayfanın hangi kategoriyi barındırdığını bulun. Bu bilgiyi DashboardFragmentRegistry 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. Etkinliğin com.android.settings.category 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ü izleyin. Aksi takdirde dinamik prosedürü izleyin.

Statik tercih oluşturma

  1. Sayfa için tercih XML dosyalarını bulun. Bu bilgiyi sayfanın getPreferenceScreenResId() yönteminden bulabilirsiniz.
  2. XML'e yeni bir Tercih öğesi ekleyin. Benzersiz bir android:key olduğundan emin olun.
  3. Bu tercih için sayfanın getPreferenceControllers() yönteminde 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 mevcutsa, bunun için zaten bir PreferenceController olması mümkündür. PreferenceController yeni bir tane oluşturmadan yeniden kullanabilirsiniz.

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

Dinamik bir tercih oluşturma

  1. Orijinal ve hedef sayfanın hangi kategoriyi barındırdığını bulun. Bu bilgiyi DashboardFragmentRegistry bulabilirsiniz.
  2. AndroidManifest yeni bir Etkinlik oluşturun
  3. Ayarı tanımlamak için yeni Etkinliğe gerekli meta verileri ekleyin. com.android.settings.category meta veri değerini 1. adımda tanımlanan değerle aynı olacak şekilde ayarlayın.

Yeni bir sayfa oluştur

  1. DashboardFragment öğesinden devralınan yeni bir parça oluşturun.
  2. DashboardFragmentRegistry 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ıza gerek yoktur.

  3. Bu sayfa için gerekli ayarları ekleme adımlarını izleyin. Daha fazla bilgi için Uygulama bölümüne bakın.

Doğrulama

  • Ayarlar'da roboelektrik testleri çalıştırın. Mevcut ve yeni testlerin tümü geçmelidir.
  • Ayarları oluşturup yükleyin, ardından değiştirilmekte olan sayfayı manuel olarak açın. Sayfanın acilen güncellenmesi gerekmektedir.