Android 8.0, ayarların düzenlenme şeklini basitleştirmek ve kullanıcıların Android cihazlarını özelleştirmek için ayarları hızlıca bulmasını kolaylaştırmak amacıyla Ayarlar uygulaması için yeni bir bilgi mimarisi kullanıma sundu. Android 9, daha fazla ayar işlevi ve daha kolay uygulama sunmak için bazı iyileştirmeler yaptı.
Örnekler ve kaynak
Ayarlar'daki çoğu sayfa şu anda yeni çerçeve kullanılarak uygulanmaktadır. DisplaySettings:packages/apps/Settings/src/com/android/settings/DisplaySettings.java
iyi bir örnektir.
Ö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ş ortaklarına özgü özellikleri barındırmak için gerektiğinde ek ayar 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 muhtemelen bir PreferenceController
ile uygulanmamıştır.
Bu nedenle, eski bir sayfadaki tercihleri yeni bir sayfaya taşırken yeni DashboardFragment
içinde örneklemeden önce bir PreferenceController
oluşturmanız ve kodu denetleyiciye taşımanız gerekir. PreferenceController
'ün gerektirdiği API'ler adlarında açıklanır ve Javadoc'da belgelenir.
Her PreferenceController
için bir birim testi eklemeniz önemle tavsiye edilir.
Değişiklik AOSP'ye gönderiliyorsa birim testi gerekir.
Robolectric tabanlı testlerin nasıl yazılacağı hakkında daha fazla bilgi edinmek için packages/apps/Settings/tests/robotests/README.md
readme dosyasını inceleyin.
Eklenti tarzı bilgi mimarisi
Her ayar öğesi bir Tercih olarak uygulanır. Bir tercih, bir sayfadan diğerine kolayca 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 makine parçasını kullanıma sundu. Ayarlar öğeleri, eklenti tarzı denetleyiciler olarak modellenmiştir. Bu nedenle, ayarlar sayfası tek bir ana makine parçası ve birden fazla ayar denetleyicisi tarafından oluşturulur.
DashboardFragment
DashboardFragment
, eklenti tarzı tercih kontrol cihazlarının ana makinesidir.
Parça, PreferenceFragment
öğesinden devralınır ve hem statik tercih listelerini hem de dinamik tercih listelerini genişletmek ve güncellemek için kancalara sahiptir.
Statik tercihler
Statik tercih listesi, XML'de <Preference>
etiketi kullanılarak tanımlanır. DashboardFragment
uygulaması, görüntülenecek 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 sahip bir karoyu temsil eder. Genellikle intent, farklı bir ayar sayfasına yönlendirir. Örneğin, Ayarlar ana sayfasındaki "Google" ayar öğesi dinamik bir öğedir. Dinamik öğeler AndroidManifest
'te (aşağıda ele alınmıştır) tanımlanı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ştiriciler bu ayarı statik olarak uygulamalıdır. Ancak dinamik ayar, aşağıdakilerden herhangi biri geçerli olduğunda yararlı olabilir:
- Bu ayar doğrudan Ayarlar uygulamasında uygulanmaz (ör. OEM/Operatör uygulamaları tarafından uygulanan bir ayarı yerleştirme).
- Ayar, Ayarlar ana sayfasında görünür.
- Bu 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 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 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>
Oluşturma sırasında, parça hem statik XML'den hem de AndroidManifest
içinde tanımlanan dinamik ayarlardan tercihler listesi ister. PreferenceController
'ler Java kodunda veya XML'de tanımlanmış olsun, DashboardFragment
her ayarın işlem mantığını PreferenceController
aracılığıyla yönetir (aşağıda ele alınmıştır). Ardından, kullanıcı arayüzünde karma bir liste olarak gösterilir.
PreferenceController
Bu bölümde açıklandığı gibi, PreferenceController
'ü Android 9 ve Android 8.x'te uygulama arasında farklılıklar vardır.
Android 9 sürümünde 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.
PreferenceController
öğesinin arayüzü BasePreferenceController
olarak tanımlanır. Örneğin, packages/apps/Settings/src/com/android/settings/core/
BasePreferenceController.java
BasePreferenceController
kapsamında, her biri Ayarlar uygulamasının varsayılan olarak desteklediği belirli bir kullanıcı arayüzü stiliyle eşlenen birkaç alt sınıf bulunur. Örneğin, TogglePreferenceController
'te kullanıcının açma/kapatma düğmesine dayalı bir tercih kullanıcı arayüzüyle nasıl etkileşim kurması gerektiğini doğrudan eşleyen bir API vardır.
BasePreferenceController
, getAvailabilityStatus()
, displayPreference()
, handlePreferenceTreeClicked(),
vb. API'lere sahiptir. Her API'nin ayrıntılı dokümanları 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, oluşturucu 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. onCreate()
yönteminde, getAvailabilityStatus()
yöntemi için tüm denetleyiciler çağrılır ve bu yöntem true 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ümlerindeki PreferenceController
PreferenceController
; görüntüleme, güncelleme, arama dizine ekleme vb. dahil olmak üzere tercihle etkileşimde bulunacak tüm mantığı içerir.
Tercih etkileşimlerine karşılık olarak,
PreferenceController
arayüzünde isAvailable()
,
displayPreference()
, handlePreferenceTreeClicked()
vb. API'ler bulunur.
Her bir API ile ilgili ayrıntılı belgeler 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, gelecekte ilgili tüm etkinliklerin kontrolöre gönderilmesi için kontrolör parçaya bağlanır.
DashboardFragment
, PreferenceControllers
listesini ekranda tutar. onCreate()
yönteminde, isAvailable()
yöntemi için tüm denetleyiciler çağrılır ve doğru döndürülü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 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
- Orijinal sayfa ve hedef sayfanın tercih XML dosyalarını bulun. Bu bilgileri sayfanın
getPreferenceScreenResId()
yönteminden bulabilirsiniz. - Tercihi orijinal sayfanın XML'inden kaldırın.
- Tercihi, hedef sayfanın XML'sine ekleyin.
- Orijinal sayfanın Java uygulamasından bu tercihe ait
PreferenceController
değerini kaldırın. GenelliklecreatePreferenceControllers()
içinde Denetleyici doğrudan XML'de tanımlanabilir.Not: Tercih için
PreferenceController
olmayabilir. - Hedef sayfanın
createPreferenceControllers()
alanındaPreferenceController
nesnesi oluşturun.PreferenceController
eski sayfada XML'de tanımlanmışsa yeni sayfa için de XML'de tanımlayın.
Android 9'da dinamik taşıma
- Orijinal ve hedef sayfanın hangi kategoride olduğunu bulun. Bu bilgileri
DashboardFragmentRegistry
bölümünde bulabilirsiniz. - Taşımanız gereken 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 sayfanın tercih XML dosyalarını bulun. Bu bilgileri sayfanın
- Orijinal sayfanın XML'inden tercihi kaldırın.
- Tercihi hedef sayfanın XML'ine ekleyin.
- Orijinal sayfanın Java uygulamasında bu tercih için
PreferenceController
değerini kaldırın. GenelliklegetPreferenceControllers()
içindedir. - Hedef sayfanın
getPreferenceControllers()
alanındaPreferenceController
nesnesi oluşturun.
getPreferenceScreenResId()
yönteminden bulabilirsiniz.
Not: Tercih için PreferenceController
olmayabilir.
Android 8.x sürümlerinde dinamik taşıma
- Orijinal ve hedef sayfanın barındırdığı kategoriyi bulun. Bu bilgileri
DashboardFragmentRegistry
adresinde bulabilirsiniz. - Taşımanız gereken ayarı içeren
AndroidManifest.xml
dosyasını açın ve bu ayarı temsil eden Etkinlik girişini bulun. - 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.
Sayfada yeni tercih oluşturma
Tercih, orijinal sayfanın tercih XML dosyasında statik olarak listelenmişse aşağıdaki statik prosedürü uygulayın. Aksi takdirde dinamik prosedürü uygulayın.
Statik tercih oluşturma
- Sayfa için tercih edilen XML dosyalarını bulun. Bu bilgiyi sayfanın getPreferenceScreenResId() yönteminde bulabilirsiniz.
- XML'e yeni bir Tercih öğesi ekleyin. Benzersiz bir
android:key
içerdiğinden emin olun. -
Sayfanın
getPreferenceControllers()
yönteminde bu tercih için birPreferenceController
tanımlayın.- Android 8.x ve isteğe bağlı olarak Android 9'da, sayfanın
createPreferenceControllers()
yönteminde bu tercih için birPreferenceController
örneği oluşturun.Bu tercih başka yerlerde zaten mevcutsa bunun için bir
PreferenceController
olabilir. Yeni birPreferenceController
oluşturmadan yeniden kullanabilirsiniz. -
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"/>
- Android 8.x ve isteğe bağlı olarak Android 9'da, sayfanın
Dinamik tercih oluşturma
- Orijinal ve hedef sayfanın hangi kategoride olduğunu bulun. Bu bilgileri
DashboardFragmentRegistry
adresinde bulabilirsiniz. AndroidManifest
'te yeni 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ğere ayarlayın.
Yeni sayfa oluştur
DashboardFragment
öğesinden devralınacak 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 dinamik tercihlere 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üne bakın.
Doğrulama
- Ayarlar'da Robolectric testlerini çalıştırı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.