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ş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 (Kontrol PaneliFragment):
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 bilgilerini uyarlamaları önerilir
gereken şekilde ek ayar sayfaları ekleyin ve
iş ortağına özgü özellikler sağlar. Tercihleri eski sayfadan taşıma (
SettingsPreferencePage
) yeni bir sayfaya (
DashboardFragment
) karmaşık olabilir. Şuradaki tercih:
eski sayfa muhtemelen PreferenceController
ile uygulanmaz.
Bu nedenle, bir tercihleri eski bir sayfadan yeni bir sayfaya taşırken
önce PreferenceController
ve kodu kumandaya taşıyın.
yeni DashboardFragment
içinde örneklendiriliyor. 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ı. Ayar öğeleri olarak modellenir. Dolayısıyla, ayarlar sayfası tek ana makine parçası ve birden fazla ayar denetleyicisi.
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ü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,
"Google" Ayarlar ana sayfasındaki 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 doğru olduğunda yararlı olabilir:
- Bu ayar doğrudan Ayarlar uygulamasında (ör. OEM/operatör uygulamaları tarafından uygulanan bir ayarın eklenmesi).
- İlgili ayar, Ayarlar ana sayfasında görünecektir.
- Bu ayar için zaten bir Etkinliğiniz var ve ekstra statik yapılandırma.
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 sabittir,
CategoryKey
adresinde tanımlanmıştı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>
Oluşturma sırasında, parça her iki statik öğeden bir Tercihler listesi ister
XML ve dinamik ayarlar AndroidManifest
içinde tanımlanır.
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). Sonra da
kullanıcı arayüzünde karma bir liste olarak görüntülenir.
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ü şu şekilde tanımlanır:
BasePreferenceController
. Ö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ı) arasındaki fark,
oluşturucu imzası aşağıdakilerden biriyle eşleşmelidir:
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 PreferenceController
ekleyin. Yükleme sırasında
ve denetleyici parçaya bağlanır, böylece gelecekteki tüm alakalı etkinlikler
denetleyiciye gönderilir.
DashboardFragment
şunların listesini tutar:
Ekranda PreferenceController
var. 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'a bunu bildirmek de önemlidir
arama sırasında hangi öğelerin kullanılabileceğini belirler.
Android 8.x sürümlerinde PreferenceController
PreferenceController
,
seçenekleri içerir. vb.
PreferenceController
arayüzünde, tercih etkileşimlerine karşılık isAvailable()
,
displayPreference()
, handlePreferenceTreeClicked()
vb. API'ler bulunur.
Her bir API'yla 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 PreferenceController
ekleyin. Yükleme sırasında
ve 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ğerini döndürür, görüntülemeyi işlemek için displayPreference()
çağrılır
mantığıyla başlayalım.
DashboardFragment'ı kullanma
Bir tercihi A sayfasından B sayfasına taşıma
Tercih, orijinal sayfanın tercih XML'inde statik olarak listeleniyorsa dosyasını yüklemek istiyorsanız Android cihazınız için Statik taşıma prosedürünü uygulayın aşağıdan yayınlayabileceksiniz. Aksi takdirde, Dinamik taşıma prosedürünü uygulayın oluşturun.
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öntemini çağırın. - Tercihi, orijinal sayfanın XML'sinden kaldırın.
- Tercihi, hedef sayfanın XML'sine ekleyin.
- Bu tercihe ait
PreferenceController
öğesini orijinal sayfanın Java uygulaması. Bu genelliklecreatePreferenceControllers()
Denetleyici şurada tanımlanabilir: XML.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 taşıma
- 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 meta veri değerini şunun için ayarlayın:
Yeni sayfanın kategori anahtarına
com.android.settings.category
ekleyin.
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.
- Bu tercih için
PreferenceController
öğesini orijinal sayfanın Java uygulaması. Genelde bu sonuçtagetPreferenceControllers()
PreferenceController
öğesini hedef sayfanıngetPreferenceControllers()
.
getPreferenceScreenResId()
yönteminden bulabilirsiniz.
Not: Tercihin
PreferenceController
.
Android 8.x sürümlerinde dinamik taşıma
- Orijinal ve hedef sayfanın barındırdığı kategoriyi bulun. Daha fazla
bu bilgiler
DashboardFragmentRegistry
içinde yer alır. - Ayarladığınız ayarı içeren
AndroidManifest.xml
dosyasını açın bulun 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'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
PreferenceController
getPreferenceControllers()
yöntemini çağırı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 varsa, muhtemelen bunun için zaten
PreferenceController
. Şunu yeniden kullanabilirsiniz: Yeni bir hesap oluşturmadanPreferenceController
. -
Android 9 sürümünden itibaren,
XML'de
PreferenceController
değerini görürsünüz. Ö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. Daha fazla
bu bilgiler
DashboardFragmentRegistry
içinde yer alır. AndroidManifest
içinde yeni bir Etkinlik oluşturun- Ayarı tanımlamak için yeni etkinliğe gerekli meta verileri ekleyin. Ayarlayın:
com.android.settings.category
için meta veri değerinin aynı değere tanımlanmıştır.
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. 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 Uygulama bölümüne göz atın.
Doğrulama
- Ayarlar'da robolektrik testleri yapın. Tüm mevcut ve yeni testler pas kullanabilir.
- Ayarları oluşturun ve yükleyin, ardından değiştirilen sayfayı manuel olarak açın. Sayfa hemen güncellenir.