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,
CategoryKeyiç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
- Orijinal sayfa ve hedef sayfa için tercih XML dosyalarını bulun. Bu bilgileri sayfanın
getPreferenceScreenResId()yönteminden bulabilirsiniz. - Tercihi orijinal sayfanın XML'sinden kaldırın.
- Tercihi hedef sayfanın XML'sine ekleyin.
- Bu tercih için
PreferenceControlleröğesini orijinal sayfanın Java uygulamasından kaldırın. GenelliklecreatePreferenceControllers()içinde yer alır. Denetleyici doğrudan XML'de tanımlanabilir.Not: Tercihin
PreferenceControllerolmayabilir. - Hedef sayfanın
PreferenceControlleriçindecreatePreferenceControllers()öğesini oluşturun.PreferenceControllereski sayfadaki XML'de tanımlanmışsa yeni sayfanın XML'sinde de tanımlayın.
Android 9'da dinamik taşıma
- Orijinal ve hedef sayfanın hangi kategoride barındırıldığını öğrenin. Bu bilgileri
DashboardFragmentRegistrybölümünde bulabilirsiniz. - Taşımak istediğiniz ayarı içeren
AndroidManifest.xmldosyasını açın ve bu ayarı temsil eden Etkinlik girişini bulun. com.android.settings.categoryiçin etkinliğin meta veri değerini yeni sayfanın kategori anahtarına ayarlayın.
Android 8.x sürümlerinde statik taşıma
- Orijinal sayfa ve hedef sayfa için tercih XML dosyalarını bulun. Bu bilgileri sayfanın
- Tercihi orijinal sayfanın XML'sinden kaldırın.
- Tercihi hedef sayfanın XML'sine ekleyin.
- Orijinal sayfanın Java uygulamasında bu tercihin
PreferenceControlleröğesini kaldırın. GenelliklegetPreferenceControllers()içinde yer alır. - Hedef sayfanın
PreferenceControlleriçindegetPreferenceControllers()öğesini oluşturun.
getPreferenceScreenResId()
yönteminden bulabilirsiniz.
Not: Tercihin PreferenceController olmayabilir.
Android 8.x sürümlerinde dinamik taşıma
- Orijinal ve hedef sayfanın hangi kategoride barındırıldığını öğrenin. Bu bilgileri
DashboardFragmentRegistryadresinde bulabilirsiniz. - Taşımak istediğiniz ayarı içeren
AndroidManifest.xmldosyasını açın ve bu ayarı temsil eden Etkinlik girişini bulun. com.android.settings.categoryiç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
- Sayfanın tercih XML dosyalarını bulun. Bu bilgiyi sayfanın getPreferenceScreenResId() yönteminden bulabilirsiniz.
- XML'ye yeni bir Tercih öğesi ekleyin. Benzersiz bir
android:key'ya sahip olduğundan emin olun. -
Sayfanın
getPreferenceControllers()yönteminde bu tercih için birPreferenceControllertanımlayın.- Android 8.x'te ve isteğe bağlı olarak Android 9'da, sayfanın
createPreferenceControllers()yönteminde bu tercih için birPreferenceControlleroluşturun.Bu tercih başka yerlerde zaten varsa
PreferenceControlleriçin daha önce oluşturulmuş birPreferenceControllerolabilir. Yeni birPreferenceControlleroluş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"/>
- Android 8.x'te ve isteğe bağlı olarak Android 9'da, sayfanın
Dinamik tercih oluşturma
- Orijinal ve hedef sayfanın hangi kategoride barındırıldığını öğrenin. Bu bilgileri
DashboardFragmentRegistryadresinde bulabilirsiniz. AndroidManifestiçinde yeni bir etkinlik oluşturma- Ayarı tanımlamak için yeni etkinliğe gerekli meta verileri ekleyin.
com.android.settings.categoryiçin meta veri değerini 1. adımda tanımlanan değerle aynı olacak şekilde ayarlayın.
Yeni sayfa oluştur
DashboardFragmentöğesinden devralan yeni bir parça oluşturun.DashboardFragmentRegistryiç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.
- 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.