Bilgi mimarisi

Android 8.0, Ayarlar uygulamasının yeni bir bilgi mimarisini tanıttı. düzenlenme biçimini basitleştirir ve kullanıcıların Android cihazlarını özelleştirmek için ayarları hızlıca bulabilir. Android 9, daha fazla bilgi sunmak için Ayarlar işlevselliği ve daha kolay uygulama.

Örnekler ve kaynak

Ayarlar'daki çoğu sayfa şu anda yeni çerçeve kullanılarak uygulanmaktadır. İyi Örnek: DisplaySettings: 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 (Kontrol PaneliFragment): 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 bilgilerini uyarlamaları önerilir gereken şekilde ek ayar sayfaları ekleyin ve iş ortağına özgü özellikler sağlar. Tercihleri eski sayfadan taşıma ( SettingsPreferencePage) yeni bir sayfaya ( DashboardFragment) karmaşık olabilir. Şuradaki tercih: eski sayfa muhtemelen PreferenceController ile uygulanmaz.

Bu nedenle, bir tercihleri eski bir sayfadan yeni bir sayfaya taşırken önce PreferenceController ve kodu kumandaya taşıyın. yeni DashboardFragment içinde örneklendiriliyor. Size yardımcı olan PreferenceController için gerekenler adlarında ve ele alacağız.

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 bkz. benioku dosyası packages/apps/Settings/tests/robotests/README.md.

Eklenti tarzı bilgi mimarisi

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

Birden fazla ayarın yerini değiştirmeyi kolaylaştırmak için Android 8.0 kullanıma sunuldu. ayar öğelerini içeren eklenti tarzı ana makine parçası. Ayar öğeleri olarak modellenir. Dolayısıyla, ayarlar sayfası tek ana makine parçası ve birden fazla ayar denetleyicisi.

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üncelleyin.

Statik tercihler

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

Dinamik tercihler

Dinamik öğe, amaca yönelik bir bloku temsil ederek harici veya dahili Etkinlik'e dokunun. Amaç genellikle farklı bir ayar sayfasına yönlendirir. Örneğin, "Google" Ayarlar ana sayfasındaki ayar öğesi dinamik bir öğedir. Dinamik öğe AndroidManifest içinde (aşağıda açıklanmıştır) tanımlanır ve yüklenir. bir FeatureProvider ( DashboardFeatureProvider olarak tanımlanır).

Dinamik ayarlar, statik olarak yapılandırılmışlardan daha ağırdır bu nedenle geliştiriciler bu ayarı statik bir ayar 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 (ör. OEM/operatör uygulamaları tarafından uygulanan bir ayarın eklenmesi).
  • İlgili ayar, Ayarlar ana sayfasında görünecektir.
  • Bu ayar için zaten bir Etkinliğiniz var ve ekstra statik yapılandırma.

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

  • Etkinliğinize intent filtresi ekleyerek, etkinliği dinamik ayar olarak işaretleyin. etkinliği'ne dokunun.
  • Ayarlar uygulamasına hangi kategoriye ait olduğunu söyleyin. Kategori sabittir, CategoryKey adresinde tanımlanmıştı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>

Oluşturma sırasında, parça her iki statik öğeden bir Tercihler listesi ister XML ve dinamik ayarlar AndroidManifest içinde tanımlanır. PreferenceController öğeleri, Java kodunda veya XML'de tanımlanır. DashboardFragment her ayarın işleme mantığını yönetir PreferenceController aracılığıyla (aşağıda açıklanmıştır). Sonra da kullanıcı arayüzünde karma bir liste olarak görüntülenir.

PreferenceController

PreferenceController uygulamasının uygulanması arasında farklar var (burada açıklandığı gibi, Android 9 ve Android 8.x) bölümüne bakın.

Android 9 sürümünde PreferenceController

PreferenceController, bilgileri görüntüleme, güncelleme, aramayı dizine ekleme vb. dahil olmak üzere

PreferenceController arayüzü şu şekilde tanımlanır: BasePreferenceController. Örneğin, packages/apps/Settings/src/com/android/settings/core/ BasePreferenceController.java.

BasePreferenceController kategorisinin her biri için birkaç alt sınıf vardır. Bu, Ayarlar uygulamasının varsayılan olarak desteklediği belirli bir kullanıcı arayüzü stiline eşleme sağlar. Örneğin, Örneğin, TogglePreferenceController, kullanıcının geçiş tabanlı tercih kullanıcı arayüzüyle nasıl etkileşimde bulunması gerektiğine karar verir.

BasePreferenceController şunun gibi API'lere sahip: getAvailabilityStatus() displayPreference(), handlePreferenceTreeClicked(), vb. Her biri için ayrıntılı belgeler API, arayüz sınıfındadır.

BasePreferenceController (ve TogglePreferenceController gibi alt sınıfları) arasındaki fark, oluşturucu imzası aşağıdakilerden biriyle eşleşmelidir:

  • 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 PreferenceController ekleyin. Yükleme sırasında ve denetleyici parçaya bağlanır, böylece gelecekteki tüm alakalı etkinlikler denetleyiciye gönderilir.

DashboardFragment şunların listesini tutar: Ekranda PreferenceController var. Parçanın onCreate(), tüm kumandalar getAvailabilityStatus() yöntemini kullanıyorsanız ve doğru değerini döndürürse Görüntüleme mantığını işlemek için displayPreference() çağrılır. getAvailabilityStatus(), Ayarlar'a bunu bildirmek de önemlidir arama sırasında hangi öğelerin kullanılabileceğini belirler.

Android 8.x sürümlerinde PreferenceController

PreferenceController, seçenekleri içerir. vb.

PreferenceController arayüzünde, tercih etkileşimlerine karşılık isAvailable(), displayPreference(), handlePreferenceTreeClicked() vb. API'ler bulunur. Her bir API'yla 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 PreferenceController ekleyin. Yükleme sırasında ve 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ğerini döndürür, görüntülemeyi işlemek için displayPreference() çağrılır mantığıyla başlayalım.

DashboardFragment'ı kullanma

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

Tercih, orijinal sayfanın tercih XML'inde statik olarak listeleniyorsa dosyasını yüklemek istiyorsanız Android cihazınız için Statik taşıma prosedürünü uygulayın aşağıdan yayınlayabileceksiniz. Aksi takdirde, Dinamik taşıma prosedürünü uygulayın oluşturun.

Android 9'da statik taşıma

  1. Orijinal sayfa ve hedef için tercih XML dosyalarını bulun sayfasını ziyaret edin. Bu bilgileri sayfanın getPreferenceScreenResId() yöntemini çağırın.
  2. Tercihi, orijinal sayfanın XML'sinden kaldırın.
  3. Tercihi, hedef sayfanın XML'sine ekleyin.
  4. Bu tercihe ait PreferenceController öğesini orijinal sayfanın Java uygulaması. Bu genellikle createPreferenceControllers() Denetleyici şurada tanımlanabilir: XML.

    Not: Tercihte PreferenceController.

  5. PreferenceController öğesini hedef sayfanın createPreferenceControllers(). Öğe PreferenceController, eski sayfadaki XML'de tanımlanıyor, tanımlayın XML olarak da ekleyebilirsiniz.

Android 9'da dinamik taşıma

  1. Orijinal ve hedef sayfanın barındırdığı kategoriyi bulun. Şunları yapabilirsiniz: bu bilgiyi DashboardFragmentRegistry içinde bulabilirsiniz.
  2. Ayarladığınız ayarı içeren AndroidManifest.xml dosyasını açın bulun ve bu ayarı temsil eden Etkinlik girişini bulun.
  3. Etkinliğin meta veri değerini şunun için ayarlayın: Yeni sayfanın kategori anahtarına com.android.settings.category ekleyin.

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. Bu tercih için PreferenceController öğesini orijinal sayfanın Java uygulaması. Genelde bu sonuçta getPreferenceControllers()
  6. Not: Tercihin PreferenceController.

  7. PreferenceController öğesini hedef sayfanın getPreferenceControllers().

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

  1. Orijinal ve hedef sayfanın barındırdığı kategoriyi bulun. Daha fazla bu bilgiler DashboardFragmentRegistry içinde yer alır.
  2. Ayarladığınız ayarı içeren AndroidManifest.xml dosyasını açın bulun 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'inde statik olarak listeleniyorsa dosyası olarak ayarlamak için aşağıdaki statik prosedürü uygulayın. Aksi takdirde dinamik prosedürüne gidin.

Statik tercih oluşturma

  1. Sayfa için tercih edilen XML dosyalarını bulun. Bu bilgileri sayfanın getPreferenceScreenResId() yönteminden alınır.
  2. XML'ye yeni bir Tercih öğesi ekleyin. Benzersiz bir android:key özelliğine sahip olduğundan emin olun.
  3. SayfanınPreferenceController getPreferenceControllers() yöntemini çağırın.
    • Android 8.x'te ve isteğe bağlı olarak Android 9'da bu tercih için bir PreferenceController örneklendir sayfasının createPreferenceControllers() yöntemi.

      Bu tercih başka yerlerde zaten varsa, muhtemelen bunun için zaten PreferenceController. Şunu yeniden kullanabilirsiniz: Yeni bir hesap oluşturmadan PreferenceController.

    • Android 9 sürümünden itibaren, XML'de PreferenceController değerini görürsünüz. Örnek:
      <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. Daha fazla bu bilgiler DashboardFragmentRegistry içinde yer alır.
  2. AndroidManifest içinde yeni bir Etkinlik oluşturun
  3. Ayarı tanımlamak için yeni etkinliğe gerekli meta verileri ekleyin. Ayarlayın: com.android.settings.category için meta veri değerinin aynı değere tanımlanmıştır.

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. Bir web sitesi dinamik tercihleri varsa, kategori anahtarı sağlamanız gerekmez.

  3. Bu sayfa için gereken ayarları ekleme adımlarını uygulayın. Daha fazla Uygulama bölümüne göz atın.

Doğrulama

  • Ayarlar'da robolektrik testleri yapın. Tüm mevcut ve yeni testler pas kullanabilir.
  • Ayarları oluşturun ve yükleyin, ardından değiştirilen sayfayı manuel olarak açın. Sayfa hemen güncellenir.