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. Tercihler kolayca bir sayfadan diğerine taşınabilir.
Android 8.0, birden fazla ayarın taşınmasını kolaylaştırmak için ayar öğeleri içeren eklenti tarzında bir ana makine parçası 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 hangi XML dosyasının içerdiğini 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. Intent genellikle 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ılan ayarlardan daha ağır olduğundan geliştiriciler genellikle ayarı statik olarak uygulamalıdır. Ancak dinamik ayar, aşağıdakilerden herhangi biri doğru 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ğ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österilirken özet metni ekleyin.
DisplaySettings
için Ayarlar uygulamasından alınmış bir örnek aşağıda verilmiştir.
<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österilirler.
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
arayüzü BasePreferenceController
olarak tanımlanır. Örneğin, packages/apps/Settings/src/com/android/settings/core/
BasePreferenceController.java
BasePreferenceController
'nin her biri, Ayarlar uygulamasının varsayılan olarak desteklediği belirli bir kullanıcı arayüzü stiliyle eşleşen birkaç alt sınıfı vardır. Ö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
'te getAvailabilityStatus()
, displayPreference()
, handlePreferenceTreeClicked(),
vb. API'ler vardır. Her API'nin ayrıntılı dokümanları 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. 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ş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, gelecekte ilgili tüm etkinliklerin kontrolöre gönderilmesi için kontrolör parçaya bağlanır.
DashboardFragment
, ekranda PreferenceControllers
listesini 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'ine ekleyin.
- Orijinal sayfanın Java uygulamasından bu tercih için
PreferenceController
öğesini 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 hareket
- 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. - 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
- 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 hangi kategoride olduğunu 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.
Bir 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
- Sayfanın tercih 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'de
PreferenceController
değerini belirtmeyi 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 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 bir etkinlik oluşturun- 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 başarılı olmalıdır.
- Ayarları derleyip yükleyin, ardından değiştirilmekte olan sayfayı manuel olarak açın. Sayfa hemen güncellenir.