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ş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 bilgilerini uyarlamaları önerilir gereken şekilde ek ayar sayfaları ekleyin ve iş ortağına özgü özellikler sağlar. Tercihleri eski sayfadan (SettingsPreferencePage olarak uygulanır) yeni bir sayfaya (DashboardFragment kullanılarak uygulanır) taşımak karmaşık olabilir. Eski sayfadaki tercih muhtemelen bir PreferenceController ile uygulanmamıştır.

Bu nedenle, eski bir sayfadan yeni bir sayfaya tercih taşırken yeni DashboardFragment içinde örneklemeden önce PreferenceController oluşturmanız ve kodu denetleyiciye taşımanız gerekir. 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ı. Ayarlar öğeleri, eklenti tarzı denetleyiciler olarak modellenmiştir. Dolayısıyla, ayarlar sayfası tek ana makine parçası ve birden fazla ayar denetleyicisi.

DashboardFragment

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, Ayarlar ana sayfasındaki "Google" 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 geçerli olduğunda yararlı olabilir:

  • Ayar doğrudan Ayarlar uygulamasına uygulanmıyorsa (ör. OEM/operatör uygulamaları tarafından uygulanan bir ayarın eklenmesi)
  • Ayar, Ayarlar ana sayfasında görünür.
  • 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ğ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, CategoryKey içinde tanımlanan bir sabittir.
  • İ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. İster 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). Ardından, kullanıcı arayüzünde karma bir liste olarak gösterilir.

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ü BasePreferenceController olarak tanımlanır. Ö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ı) uygulamayla ilgili 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) {}

Kontrol paneli, parçaya bir tercih yüklerken görüntüleme süresinden önce PreferenceController eklemek için bir yöntem sağlar. Yükleme sırasında, gelecekte ilgili tüm etkinliklerin kontrolöre gönderilmesi için kontrolör parçaya bağlanır.

DashboardFragment, ekranda PreferenceController'lerin listesini tutar. 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 ç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şime geçecek tüm mantığı içerir.

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ı dokümanlar arayüz sınıfında bulunabilir.

Kontrol paneli, parçaya bir tercih yüklerken görüntüleme süresinden önce PreferenceController eklemek için bir yöntem sağlar. Yükleme sırasında ve denetleyici parçaya bağlanır, böylece gelecekteki tüm alakalı etkinlikler denetleyiciye gönderilir.

DashboardFragment, ekranda PreferenceControllers listesini 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'i kullanma

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

Tercih, orijinal sayfanın tercih XML dosyasında statik olarak listelenmişse 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 için tercih XML dosyalarını bulun sayfasını ziyaret edin. Bu bilgileri sayfanın getPreferenceScreenResId() yönteminden bulabilirsiniz.
  2. Tercihi, orijinal sayfanın XML'sinden kaldırın.
  3. Tercihi hedef sayfanın XML'ine ekleyin.
  4. Bu tercihe ait PreferenceController öğesini orijinal sayfanın Java uygulaması. Genellikle createPreferenceControllers() içinde Denetleyici doğrudan XML'de tanımlanabilir.

    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 hareket

  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 com.android.settings.category iç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'inden tercihi kaldırın.
  4. Tercihi hedef sayfanın XML'ine ekleyin.
  5. Bu tercih için PreferenceController öğesini orijinal sayfanın Java uygulaması. Genellikle getPreferenceControllers() içindedir.
  6. Not: Tercihin PreferenceController.

  7. Hedef sayfanın getPreferenceControllers() alanında PreferenceController nesnesi oluşturun.

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

  1. Orijinal ve hedef sayfanın hangi kategoriyi barındırdığını bulun. Bu bilgileri DashboardFragmentRegistry adresinde 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 iç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ı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 bu tercih için bir PreferenceController örneklendir sayfasının createPreferenceControllers() yöntemi.

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

    • Android 9'dan itibaren, tercihin yanında XML olarak PreferenceController belirtmeyi seçebilirsiniz. Ö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. Bu bilgileri DashboardFragmentRegistry adresinde 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 öğesinden devralınacak yeni bir parça oluşturun.
  2. DashboardFragmentRegistry içinde kategorisini 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 bilgi için Uygulama bölümüne bakın.

Doğrulama

  • Ayarlar'da robolektrik testleri yapın. Mevcut ve yeni tüm testler geçmelidir.
  • Ayarlar'ı derleyip yükleyin, ardından değiştirilmekte olan sayfayı manuel olarak açın. Sayfa hemen güncellenir.