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ı bir şekilde bulmasını kolaylaştırmak amacıyla Ayarlar uygulaması için yeni bir bilgi mimarisini kullanıma sundu. Android 9, daha fazla Ayarlar işlevi ve daha kolay uygulama sağlamak için bazı iyileştirmeler sundu.
Örnekler ve kaynak
Ayarlar'daki çoğu sayfa şu anda yeni çerçeve kullanılarak uygulanmaktadır. DisplaySettings de iyi bir örnektir:
packages/apps/Settings/src/com/android/settings/DisplaySettings.java
Önemli bileşenlere ait 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 sunulmuştur):
packages/apps/Settings/src/com/android/settings/core/BasePreferenceController.java
Uygulama
Cihaz üreticilerinin mevcut Ayarlar bilgi mimarisini uyarlamaları ve iş ortaklarına özgü özellikleri karşılamak 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, muhtemelen PreferenceController
ile uygulanmaz.
Bu nedenle, bir tercihleri eski bir sayfadan yeni bir sayfaya taşırken, bir PreferenceController
oluşturmanız ve yeni DashboardFragment
uygulamasında tetiklemeden önce kodu denetleyiciye taşımanız gerekir. PreferenceController
için gereken API'ler adlarında açıklanmıştır ve Javadoc'ta belgelenir.
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 beni okuma dosyasına packages/apps/Settings/tests/robotests/README.md
bakın.
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. Ayar öğeleri, eklenti tarzı denetleyiciler olarak modellenir. Dolayısıyla, ayarlar sayfası tek bir ana makine parçası ve birden fazla ayar denetleyicisi tarafından oluşturulur.
Kontrol Paneli Parçası
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üncellemek için kancalara sahiptir.
Statik tercihler
Statik tercih listesi, XML'de <Preference>
etiketi kullanılarak tanımlanır. DashboardFragment
uygulaması, hangi XML dosyasının görüntülenecek statik tercih listesini içerdiğini tanımlamak için getPreferenceScreenResId()
yöntemini kullanır.
Dinamik tercihler
Dinamik öğe, amaca yönelik bir bloku temsil eder ve harici veya dahili etkinliğe yol açar. Amaç genellikle farklı bir ayar sayfasına yönlendirir. Örneğin, Ayarlar ana sayfasındaki "Google" ayar öğesi dinamik bir öğedir. Dinamik öğeler, AndroidManifest
bölümünde 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, normalde geliştiriciler bu ayarı statik olarak uygulamalıdır. Ancak dinamik ayar, aşağıdakilerden herhangi biri doğru olduğunda yararlı olabilir:
- Bu ayar doğrudan Ayarlar uygulamasında uygulanmaz (ör. OEM/Operatör uygulamaları tarafından uygulanan bir ayarı yerleştirme).
- İlgili ayar, Ayarlar ana sayfasında görünecektir.
- 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 sabittir ve
CategoryKey
ile tanımlanır. - İ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. PreferenceController
'ler ister Java kodunda ister XML'de tanımlanmış olsun, DashboardFragment
her ayarın işleme mantığını PreferenceController
üzerinden yönetir (aşağıda açıklanmıştır). Daha sonra, kullanıcı arayüzünde
karma bir liste olarak görüntülenirler.
PreferenceController
Bu bölümde açıklandığı gibi, PreferenceController
uygulamasının Android 9 ve Android 8.x
sürümünde uygulanması 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şimde bulunacak 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
adresindeki koda bakın
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
, kullanıcının açma/kapatma tabanlı tercih kullanıcı arayüzüyle nasıl etkileşimde bulunması gerektiğiyle doğrudan eşlenen bir API'ye sahiptir.
BasePreferenceController
; getAvailabilityStatus()
, displayPreference()
,
handlePreferenceTreeClicked(),
gibi API'lere sahiptir. Her API'ye ilişkin ayrıntılı belgeler 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) {}
Parçaya bir tercih yüklenirken kontrol paneli, görüntüleme zamanından önce PreferenceController
ekleme yöntemi sağlar. Yükleme sırasında denetleyici, parçaya bağlanır. Böylece gelecekteki tüm alakalı etkinlikler denetleyiciye gönderilir.
DashboardFragment
, PreferenceController
'ların listesini
ekranda tutar. Parçanın onCreate()
konumunda tüm denetleyiciler, getAvailabilityStatus()
yöntemi için çağrılır. true (doğru) değerini döndürürse displayPreference()
, görüntüleme mantığını işlemek için ç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ş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.
Parçaya bir tercih yüklenirken kontrol paneli, görüntüleme zamanından önce PreferenceController
ekleme yöntemi sağlar. Yükleme sırasında denetleyici, parçaya bağlanır. Böylece gelecekteki tüm alakalı etkinlikler denetleyiciye gönderilir.
DashboardFragment
, PreferenceControllers
listesini ekranda tutar. Parçanın onCreate()
konumunda, tüm denetleyiciler isAvailable()
yöntemi için çağrılır. true değeri döndürülü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 aşağıdaki Android sürümünüz için 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.
- Orijinal sayfanın Java uygulamasından bu tercihe ait
PreferenceController
değerini kaldırın. Bu, genelliklecreatePreferenceControllers()
olur. Denetleyici doğrudan XML'de tanımlanabilir.Not: Tercihte
PreferenceController
olmayabilir. - Hedef sayfanın
createPreferenceControllers()
bölümündePreferenceController
öğesini örneklendirin.PreferenceController
eski sayfada XML olarak tanımlanırsa bunu yeni sayfa için XML olarak da tanımlayın.
Android 9'da dinamik taşıma
- Orijinal ve hedef sayfanın barındırdığı kategoriyi 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 sayfa için tercih XML dosyalarını bulun. Bu bilgileri sayfanın
- Orijinal sayfanın XML'sindeki tercihi kaldırın.
- Tercihi, hedef sayfanın XML'sine ekleyin.
- Orijinal sayfanın Java uygulamasında bu tercihe ait
PreferenceController
değerini kaldırın. GenelliklegetPreferenceControllers()
olur. - Hedef sayfanın
getPreferenceControllers()
bölümündePreferenceController
öğesini örneklendirin.
getPreferenceScreenResId()
yönteminden bulabilirsiniz.
Not: Tercihte PreferenceController
olmayabilir.
Android 8.x sürümlerinde dinamik taşıma
- Orijinal ve hedef sayfanın barındırdığı kategoriyi 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 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 listeleniyorsa 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 bilgileri sayfanın getPreferenceScreenResId() yönteminden bulabilirsiniz.
- XML'ye yeni bir Tercih öğesi ekleyin. Benzersiz bir
android:key
özelliğine 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 zaten
PreferenceController
olabilir. Yeni bir kod oluşturmadanPreferenceController
öğesini yeniden kullanabilirsiniz. -
Android 9'dan itibaren tercihin yanında
PreferenceController
öğesini XML olarak 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'te ve isteğe bağlı olarak Android 9'da,
sayfanın
Dinamik tercih oluşturma
- Orijinal ve hedef sayfanın barındırdığı kategoriyi bulun. Bu bilgileri
DashboardFragmentRegistry
bölümünde bulabilirsiniz. AndroidManifest
içinde 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
kaynağından devralan yeni bir parça oluşturun.- Kategorisini
DashboardFragmentRegistry
kullanarak 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üne bakın.
Doğrulama
- Ayarlar'da robolektrik testleri yapın. Mevcut ve yeni tüm testler başarılı olacaktır.
- Ayarları oluşturun ve yükleyin, ardından değiştirilen sayfayı manuel olarak açın. Sayfa hemen güncellenir.