Android 8.0, Ayarlar uygulamasının yeni bir bilgi mimarisini tanıttı. düzenlenme biçimini basitleştirir ve kullanıcıların Android cihazlarını özelleştirmek için ayarları hızlıca bulabilir. Android 9, daha fazla bilgi sunmak için Ayarlar işlevselliği ve daha kolay uygulama.
Örnekler ve kaynak
Ayarlar'daki çoğu sayfa şu anda yeni çerçeve kullanılarak uygulanmaktadır. İyi
Örnek: DisplaySettings:
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 bilgilerini uyarlamaları önerilir
gereken şekilde ek ayar sayfaları ekleyin ve
iş ortağına özgü özellikler sağlar. 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 sayfadan yeni bir sayfaya tercih taşırken yeni DashboardFragment
içinde örneklemeden önce PreferenceController
oluşturmanız ve kodu denetleyiciye taşımanız gerekir. Size yardımcı olan
PreferenceController
için gerekenler adlarında ve
ele alacağız.
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 bkz.
benioku dosyası packages/apps/Settings/tests/robotests/README.md
.
Eklenti tarzı bilgi mimarisi
Her ayar öğesi bir Tercih olarak uygulanır. Bir tercih, kolayca bir sayfadan diğerine taşınır.
Birden fazla ayarın yerini değiştirmeyi kolaylaştırmak için Android 8.0 kullanıma sunuldu. ayar öğelerini içeren eklenti tarzı ana makine parçası. Ayarlar öğeleri, eklenti tarzı denetleyiciler olarak modellenmiştir. Dolayısıyla, ayarlar sayfası tek ana makine parçası ve birden fazla ayar denetleyicisi.
DashboardFragment
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üncelleyin.
Statik tercihler
Statik tercih listesi, XML'de <Preference>
etiketi kullanılarak tanımlanır. CEVAP
DashboardFragment
uygulaması,
XML dosyasının hangi XML dosyasını içerdiğini tanımlamak için kullanılan getPreferenceScreenResId()
yöntemi
statik tercih listesi.
Dinamik tercihler
Dinamik öğe, amaca yönelik bir bloku temsil ederek harici veya dahili
Etkinlik'e dokunun. Amaç genellikle farklı bir ayar sayfasına yönlendirir. Örneğin, Ayarlar ana sayfasındaki "Google" ayar öğesi dinamik bir öğedir. Dinamik
öğe AndroidManifest
içinde (aşağıda açıklanmıştır) tanımlanır ve yüklenir.
bir FeatureProvider
(
DashboardFeatureProvider
olarak tanımlanır).
Dinamik ayarlar, statik olarak yapılandırılmışlardan daha ağırdır bu nedenle geliştiriciler bu ayarı statik bir ayar olarak uygulamalıdır. Ancak dinamik ayar, aşağıdakilerden herhangi biri geçerli 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ğinize intent filtresi ekleyerek, etkinliği dinamik ayar olarak işaretleyin. etkinliği'ne dokunun.
- 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>
Parça, oluşturma sırasında hem statik XML'den hem de AndroidManifest
içinde tanımlanan dinamik ayarlardan tercihler listesi ister. İster
PreferenceController
öğeleri, Java kodunda veya XML'de tanımlanır.
DashboardFragment
her ayarın işleme mantığını yönetir
PreferenceController
aracılığıyla (aşağıda açıklanmıştır). Ardından, kullanıcı arayüzünde karma bir liste olarak gösterilir.
PreferenceController
PreferenceController
uygulamasının uygulanması arasında farklar var
(burada açıklandığı gibi, Android 9 ve Android 8.x)
bölümüne bakın.
Android 9 sürümünde PreferenceController
PreferenceController
,
bilgileri görüntüleme, güncelleme, aramayı dizine ekleme vb. dahil olmak üzere
PreferenceController
arayüzü BasePreferenceController
olarak tanımlanır. Örneğin,
packages/apps/Settings/src/com/android/settings/core/
BasePreferenceController.java
.
BasePreferenceController
kategorisinin her biri için birkaç alt sınıf vardır.
Bu, Ayarlar uygulamasının varsayılan olarak desteklediği belirli bir kullanıcı arayüzü stiline eşleme sağlar. Örneğin,
Örneğin, TogglePreferenceController
,
kullanıcının geçiş tabanlı tercih kullanıcı arayüzüyle nasıl
etkileşimde bulunması gerektiğine karar verir.
BasePreferenceController
şunun gibi API'lere sahip:
getAvailabilityStatus()
displayPreference()
,
handlePreferenceTreeClicked(),
vb. Her biri için ayrıntılı belgeler
API, 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. Parçanın
onCreate()
, tüm kumandalar
getAvailabilityStatus()
yöntemini kullanıyorsanız ve
doğru değerini 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ümlerinde 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
ve denetleyici parçaya bağlanır, böylece gelecekteki tüm alakalı etkinlikler
denetleyiciye gönderilir.
DashboardFragment
, ekranda PreferenceControllers
listesini tutar. Parçanın onCreate()
konumunda tümü
Denetleyiciler, isAvailable()
yöntemi için çağrılır.
true değerini döndürür, görüntülemeyi işlemek için displayPreference()
çağrılır
mantığıyla başlayalım.
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 için tercih XML dosyalarını bulun
sayfasını ziyaret edin. Bu bilgileri sayfanın
getPreferenceScreenResId()
yönteminden bulabilirsiniz. - Tercihi, orijinal sayfanın XML'sinden kaldırın.
- Tercihi hedef sayfanın XML'ine ekleyin.
- Bu tercihe ait
PreferenceController
öğesini orijinal sayfanın Java uygulaması. GenelliklecreatePreferenceControllers()
içinde Denetleyici doğrudan XML'de tanımlanabilir.Not: Tercihte
PreferenceController
. PreferenceController
öğesini hedef sayfanıncreatePreferenceControllers()
. ÖğePreferenceController
, eski sayfadaki XML'de tanımlanıyor, tanımlayın XML olarak da ekleyebilirsiniz.
Android 9'da dinamik hareket
- Orijinal ve hedef sayfanın barındırdığı kategoriyi bulun. Şunları yapabilirsiniz:
bu bilgiyi
DashboardFragmentRegistry
içinde bulabilirsiniz. - Ayarladığınız ayarı içeren
AndroidManifest.xml
dosyasını açın bulun 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 sayfa için 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.
- Bu tercih için
PreferenceController
öğesini orijinal sayfanın Java uygulaması. GenelliklegetPreferenceControllers()
içindedir. - Hedef sayfanın
getPreferenceControllers()
alanındaPreferenceController
nesnesi oluşturun.
getPreferenceScreenResId()
yönteminden bulabilirsiniz.
Not: Tercihin
PreferenceController
.
Android 8.x sürümlerinde dinamik taşıma
- Orijinal ve hedef sayfanın hangi kategoriyi barındırdığını 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'inde statik olarak listeleniyorsa dosyası olarak ayarlamak için aşağıdaki statik prosedürü uygulayın. Aksi takdirde dinamik prosedürüne gidin.
Statik tercih oluşturma
- Sayfa için tercih edilen XML dosyalarını bulun. Bu bilgileri sayfanın getPreferenceScreenResId() yönteminden alınır.
- 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
bu tercih için bir
PreferenceController
örneklendir sayfasınıncreatePreferenceControllers()
yöntemi.Bu tercih başka yerlerde zaten mevcutsa bunun için bir
PreferenceController
olabilir. Şunu yeniden kullanabilirsiniz: Yeni bir hesap oluşturmadanPreferenceController
. -
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'te ve isteğe bağlı olarak Android 9'da
bu tercih için bir
Dinamik tercih oluşturma
- Orijinal ve hedef sayfanın barındırdığı kategoriyi bulun. Bu bilgileri
DashboardFragmentRegistry
adresinde 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
öğ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. Bir web sitesi dinamik tercihleri varsa, 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 geçmelidir.
- Ayarlar'ı derleyip yükleyin, ardından değiştirilmekte olan sayfayı manuel olarak açın. Sayfa hemen güncellenir.