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,
CategoryKey
iç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. PreferenceController
Java 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
PreferenceController
olmayabilir. - Hedef sayfanın
PreferenceController
içindecreatePreferenceControllers()
öğesini oluşturun.PreferenceController
eski 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
DashboardFragmentRegistry
bölümünde bulabilirsiniz. - Taşımak istediğiniz ayarı içeren
AndroidManifest.xml
dosyasını açın ve bu ayarı temsil eden Etkinlik girişini bulun. 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
- 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
PreferenceController
iç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
DashboardFragmentRegistry
adresinde bulabilirsiniz. - Taşımak istediğiniz ayarı içeren
AndroidManifest.xml
dosyasını açın ve bu ayarı temsil eden Etkinlik girişini bulun. 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.
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 birPreferenceController
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 birPreferenceController
oluşturun.Bu tercih başka yerlerde zaten varsa
PreferenceController
için daha önce oluşturulmuş birPreferenceController
olabilir. Yeni birPreferenceController
oluş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
DashboardFragmentRegistry
adresinde bulabilirsiniz. AndroidManifest
içinde yeni bir etkinlik oluşturma- 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ğerle aynı olacak şekilde ayarlayın.
Yeni sayfa oluştur
DashboardFragment
öğesinden devralan yeni bir parça oluşturun.DashboardFragmentRegistry
iç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.