Android 8.0, ayarların düzenlenme şeklini basitleştirmek ve kullanıcıların Android cihazlarını özelleştirmek için ayarları hızla bulmasını kolaylaştırmak amacıyla Ayarlar uygulamasına yönelik yeni bir bilgi mimarisi sundu. Android 9, daha fazla Ayarlar işlevselliği 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. Bunun iyi bir örneği 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 tanıtıldı):
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 ayar sayfaları eklemeleri teşvik edilmektedir. 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.
Dolayısıyla, bir tercihi eski bir sayfadan yeni bir sayfaya taşırken, bir PreferenceController
oluşturmanız ve kodu yeni DashboardFragment
başlatmadan önce denetleyiciye taşımanız gerekir. PreferenceController
gerektirdiği API'ler adlarında açıklanmış ve Javadoc'ta belgelenmiştir.
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ı testlerin nasıl yazılacağı hakkında daha fazla bilgi almak için packages/apps/Settings/tests/robotests/README.md
bakın.
Eklenti tarzı bilgi mimarisi
Her ayar öğesi bir Tercih olarak uygulanır. Bir Tercih kolaylıkla bir sayfadan diğerine 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 bilgisayar parçası sundu. Ayarlar öğeleri eklenti tarzı denetleyiciler olarak modellenmiştir. Bu nedenle, bir ayarlar sayfası tek bir ana bilgisayar parçası ve birden fazla ayar denetleyicisi tarafından oluşturulur.
Kontrol Paneli Parçası
DashboardFragment
, eklenti tarzı tercih denetleyicilerinin ana bilgisayarıdır. Parça, PreferenceFragment
miras alır ve hem statik tercih listelerini hem de dinamik tercih listelerini genişletmek ve güncellemek için kancalara sahiptir.
Statik tercihler
XML'de <Preference>
etiketi kullanılarak statik bir tercih listesi tanımlanır. DashboardFragment
uygulaması, hangi XML dosyasının görüntülenecek statik tercihler listesini içerdiğini tanımlamak için getPreferenceScreenResId()
yöntemini kullanır.
Dinamik tercihler
Dinamik bir öğe, harici veya dahili bir Etkinliğe yol açan, amacı olan bir kutucuğu temsil eder. Genellikle amaç farklı bir ayar sayfasına yönlendirir. Örneğin, Ayarlar ana sayfasındaki "Google" ayar öğesi dinamik bir öğedir. Dinamik öğeler AndroidManifest
tanımlanır (aşağıda tartışılmıştı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ştiricilerin ayarı statik bir ayar olarak uygulaması gerekir. Ancak aşağıdakilerden herhangi biri doğru olduğunda dinamik ayar yararlı olabilir:
- Ayar, doğrudan Ayarlar uygulamasında uygulanmaz (örneğin, OEM/Carrier uygulamaları tarafından uygulanan bir ayarın enjekte edilmesi).
- Ayar, Ayarlar ana sayfasında görünmelidir.
- Ayar için zaten bir Etkinliğiniz var ve ekstra 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 amaç filtresi ekleyerek etkinliği dinamik bir ayar olarak işaretleyin.
- Ayarlar uygulamasına hangi kategoriye ait olduğunu söyleyin. Kategori,
CategoryKey
tanımlanan bir sabittir. - İsteğe bağlı: Ayar görüntülendiğinde özet metni ekleyin.
İşte DisplaySettings
için Ayarlar uygulamasından alınan bir örnek.
<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, AndroidManifest
tanımlanan hem statik XML hem de dinamik ayarlardan bir Tercihler listesi isteyecektir. PreferenceController
ister Java kodunda ister XML'de tanımlanmış olsun, DashboardFragment
her ayarın işleme mantığını PreferenceController
(aşağıda tartışılmıştır) aracılığıyla yönetir. Daha sonra kullanıcı arayüzünde karışık bir liste olarak görüntülenirler.
Tercih Denetleyicisi
Bu bölümde açıklandığı gibi, PreferenceController
Android 9 ve Android 8.x'te uygulamak arasında farklar vardır.
Android 9 sürümünde PreferenceController
Bir PreferenceController
, görüntüleme, güncelleme, arama indeksleme vb. dahil olmak üzere tercihle etkileşime girecek 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
dosyasındaki koda bakın
BasePreferenceController
birkaç alt sınıfı vardır ve her biri Ayarlar uygulamasının varsayılan olarak desteklediği belirli bir kullanıcı arayüzü stiliyle eşleşir. Örneğin, TogglePreferenceController
kullanıcının geçiş tabanlı tercih kullanıcı arayüzüyle nasıl etkileşimde bulunması gerektiğini doğrudan eşleştiren bir API'ye sahiptir.
BasePreferenceController
getAvailabilityStatus()
, displayPreference()
, handlePreferenceTreeClicked(),
Her API için 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, yapıcı 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üklerken kontrol paneli, görüntüleme zamanından önce bir PreferenceController
eklemek için bir yöntem sağlar. Kurulum sırasında denetleyici parçaya bağlanır, böylece gelecekteki tüm ilgili olaylar denetleyiciye gönderilir.
DashboardFragment
ekranda PreferenceController
bir listesini tutar. Parçanın onCreate()
konumunda, getAvailabilityStatus()
yöntemi için tüm denetleyiciler çağrılır ve true değerini döndürürse, görüntüleme mantığını işlemek için displayPreference()
çağrılır. getAvailabilityStatus()
aynı zamanda Ayarlar çerçevesine arama sırasında hangi öğelerin mevcut olduğunu bildirmek açısından da önemlidir. Android 8.x sürümlerinde PreferenceController
Bir PreferenceController
, görüntüleme, güncelleme, arama indeksleme dahil olmak üzere tercihle etkileşime girecek tüm mantığı içerir. vesaire.
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ı belgeler, arayüz sınıfında bulunabilir.
Parçaya bir tercih yüklerken kontrol paneli, görüntüleme zamanından önce bir PreferenceController
eklemek için bir yöntem sağlar. Kurulum sırasında denetleyici parçaya bağlanır, böylece gelecekteki tüm ilgili olaylar denetleyiciye gönderilir.
DashboardFragment
ekranda PreferenceControllers
bir listesini tutar. Parçanın onCreate()
konumunda, isAvailable()
yöntemi için tüm denetleyiciler çağrılır ve true değerini döndürü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 listeleniyorsa, aşağıdaki Android sürümünüze yönelik Statik taşıma prosedürünü izleyin. Aksi takdirde, Android sürümünüz için Dinamik taşıma prosedürünü izleyin.
Android 9'da statik hareket
- Orijinal sayfa ve hedef sayfa için tercih XML dosyalarını bulun. Bu bilgiyi sayfanın
getPreferenceScreenResId()
yönteminden bulabilirsiniz. - Tercihi orijinal sayfanın XML'inden kaldırın.
- Tercihi hedef sayfanın XML'sine ekleyin.
- Bu tercih için
PreferenceController
orijinal sayfanın Java uygulamasından kaldırın. GenelliklecreatePreferenceControllers()
içindedir. Denetleyici doğrudan XML'de bildirilebilir.Not : Tercihte
PreferenceController
olmayabilir. - Hedef sayfanın
createPreferenceControllers()
dosyasındaPreferenceController
örneğini oluşturun.PreferenceController
eski sayfada XML'de tanımlanmışsa, onu yeni sayfa için de XML'de tanımlayın.
Android 9'da dinamik hareket
- Orijinal ve hedef sayfanın hangi kategoriyi barındırdığını bulun. Bu bilgiyi
DashboardFragmentRegistry
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
meta veri değerini yeni sayfanın kategori anahtarına ayarlayın.
Android 8.x sürümlerinde statik hareket
- Orijinal sayfa ve hedef sayfa için tercih XML dosyalarını bulun. Bu bilgiyi sayfanın
- Orijinal sayfanın XML'indeki tercihi kaldırın.
- Tercihi hedef sayfanın XML'sine ekleyin.
- Orijinal sayfanın Java uygulamasında bu tercih için
PreferenceController
kaldırın. GenelliklegetPreferenceControllers()
içindedir. - Hedef sayfanın
getPreferenceControllers()
öğesindePreferenceController
örneğini oluşturun.
getPreferenceScreenResId()
yönteminden bulabilirsiniz. Not : Tercihin bir PreferenceController
sahip olmaması mümkündür.
Android 8.x sürümlerinde dinamik hareket
- Orijinal ve hedef sayfanın hangi kategoriyi barındırdığını bulun. Bu bilgiyi
DashboardFragmentRegistry
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
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ü izleyin. Aksi takdirde dinamik prosedürü izleyin.
Statik tercih oluşturma
- Sayfa için tercih XML dosyalarını bulun. Bu bilgiyi sayfanın getPreferenceScreenResId() yönteminden bulabilirsiniz.
- XML'e yeni bir Tercih öğesi ekleyin. Benzersiz bir
android:key
olduğundan emin olun. - Bu tercih için sayfanın
getPreferenceControllers()
yönteminde 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 mevcutsa, bunun için zaten bir
PreferenceController
olması mümkündür.PreferenceController
yeni bir tane oluşturmadan yeniden kullanabilirsiniz. - Android 9'dan başlayarak, tercihin yanında XML'de
PreferenceController
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 bir tercih oluşturma
- Orijinal ve hedef sayfanın hangi kategoriyi barındırdığını bulun. Bu bilgiyi
DashboardFragmentRegistry
bulabilirsiniz. -
AndroidManifest
yeni bir Etkinlik oluşturun - Ayarı tanımlamak için yeni Etkinliğe gerekli meta verileri ekleyin.
com.android.settings.category
meta veri değerini 1. adımda tanımlanan değerle aynı olacak şekilde ayarlayın.
Yeni bir sayfa oluştur
-
DashboardFragment
öğesinden devralınan yeni bir parça oluşturun. -
DashboardFragmentRegistry
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ıza gerek yoktur.
- Bu sayfa için gerekli ayarları ekleme adımlarını izleyin. Daha fazla bilgi için Uygulama bölümüne bakın.
Doğrulama
- Ayarlar'da roboelektrik testleri çalıştırın. Mevcut ve yeni testlerin tümü geçmelidir.
- Ayarları oluşturup yükleyin, ardından değiştirilmekte olan sayfayı manuel olarak açın. Sayfanın acilen güncellenmesi gerekmektedir.