Untuk menyesuaikan kolom sistem, gunakan kombinasi konfigurasi XML dan modul Dagger ke komponen UI.
Menentukan perilaku kolom sistem
Untuk menentukan kolom sistem, gunakan tag <SystemBar> dalam file XML untuk menentukan
tampilan dan animasi. File XML ini adalah bagian dari overlay resource runtime (RRO).
Atribut tag SystemBar
Elemen root untuk konfigurasi kolom sistem adalah <SystemBar>, yang mendukung
atribut berikut:
| Atribut | Status | Deskripsi |
|---|---|---|
id |
Wajib | ID resource unik untuk kolom sistem. Misalnya,
@id/my_custom_status_bar |
type |
Wajib | Menentukan jenis kolom sistem, yaitu
status atau navigation |
barZOrder |
Wajib | Bilangan bulat untuk mewakili Z-order kolom sistem. Nilai yang lebih tinggi menunjukkan bahwa sistem menggambar kolom di atas yang lain. Harus berupa bilangan bulat positif. Aturan berikut berlaku:
|
defaultVariant |
Wajib | ID <Variant> yang berlaku secara default saat
kolom sistem diinisialisasi |
displayId |
Opsional | ID <Variant> yang berlaku secara default saat
kolom sistem diinisialisasi |
hideForKeyboard |
Opsional |
Nilai boolean Jika atribut ini adalah |
dragOpenNotification |
Opsional |
Nilai boolean |
dragCloseNotification |
Opsional |
Nilai boolean |
ID dan jenis kolom sistem
Hindari penggunaan TopCarSystemBar, BottomCarSystemBar, LeftCarSystemBar, dan RightCarSystemBar sebagai nilai id. Sistem mencadangkan ID ini untuk kompatibilitas mundur, dan penggunaannya dapat menyebabkan perilaku yang tidak terduga.
Untuk konfigurasi kolom status atas dasar dan kolom navigasi bawah, gunakan status dan nav, masing-masing, sebagai nilai atribut type.
Jika menggunakan ID ini, Anda dapat melewati bagian yang berjudul Menyediakan UI kolom sistem dengan Dagger.
<Variant>- Menentukan status visual. Untuk mempelajari lebih lanjut, lihat Menggunakan varian untuk
mendesain status visual. Dalam tag
<SystemBar>, tentukan satu atau beberapa<Variant>tag. Setiap varian mewakili status visual yang berbeda dan berisi properti yang mengontrol tampilan kolom sistem dalam status tersebut. <Visibility isVisible="true|false">- Mengontrol visibilitas kolom sistem. Boolean
isVisiblememberi sinyal apakah kolom sistem terlihat atau tidak. <Alpha alpha="float_value">- Mengontrol transparansi kolom sistem. Nilai untuk
alphamengambang antara0.0(sepenuhnya transparan) dan1.0(sepenuhnya buram). <Bounds .../>Menentukan posisi dan ukuran kolom sistem. Untuk elemen
<SystemBar>, batas harus menyentuh setidaknya satu tepi tampilan (kiri, atas, kanan, atau bawah). Atributnya adalah:left,top,right,bottom: Koordinat absolut.width,height: Dimensi.leftOffset,topOffset,rightOffset,bottomOffset: Offset ke arah tengah persegi panjang.
<Corner radius="dimen"/>Menentukan radius sudut kolom sistem. Untuk
radius, masukkan dimensi radius sudut.<Insets .../>Menentukan sisipan untuk kolom sistem. Atributnya adalah
left,top,right, danbottom. Untuk setiap atribut, masukkan nilai dimensi untuk sisipan.<Gravity .../>Menentukan gravitasi konten kolom sistem. Untuk mempelajari lebih lanjut, lihat
HunTagXmlParserKt.GRAVITY_TAGdalam kode sumber.- Jika Anda menghilangkan nilai untuk gravitasi, sistem akan menghitungnya secara internal.
- Nilai yang didukung adalah kombinasi
TOP,BOTTOM,LEFT,RIGHT,CENTER,CENTER_HORIZONTAL,CENTER_VERTICAL, danFILL_HORIZONTAL, yang masing-masing dipisahkan oleh karakter|.
Unit dimensi
Tentukan dimensi dengan px, dp (atau dip), %, atau referensi ke resource dimension, integer, fraction, string, atau attribute.
Transisi: Menganimasikan antar-varian
Untuk mempelajari lebih lanjut, lihat Mengonfigurasi transisi. Gunakan blok <Transitions> untuk
menentukan cara kolom sistem menganimasikan antar-varian yang berbeda:
| Item | Atribut tag |
|---|---|
<Transition> |
fromVariant, toVariant, onEvent, onEventTokens, animator, duration, delay, interpolator |
<Transitions> |
defaultDuration, defaultInterpolator |
UI yang dapat diskalakan hanya mendukung transisi di kolom sistem jika Anda menentukannya untuk kasus penggunaan mode non-immersive. Artinya, mode immersive tidak memicu transisi jendela UI yang Dapat Diskala untuk kolom sistem saat menyembunyikan (atau menampilkan) kolom sistem.
UI yang Dapat Diskala terus mengirim peristiwa untuk menyembunyikan (atau menampilkan) kolom sistem sehingga panel lain dapat merespons sesuai kebutuhan, sementara transisi untuk menyembunyikan dan menampilkan kolom sistem harus disediakan agar atribut hideForKeyboard berfungsi dengan baik. Pertimbangkan contoh struktur XML ini:
<SystemBar id="@id/my_custom_status_bar" type="status" barZOrder="0" defaultVariant="@id/default_variant" hideForKeyboard="true">
<Variant id="@+id/default_variant">
<Bounds top="0px" left="0px" right="100%" height="100px"/>
<Visibility isVisible="true"/>
</Variant>
<Variant id="@+id/hidden_variant" parent="@id/default_variant">
<Visibility isVisible="false"/>
</Variant>
<Transitions>
<Transition onEvent="_System_Show_Panel" onEventTokens="panelId= my_custom_status_bar" toVariant="@id/default_variant"/>
<Transition onEvent="_System_Hide_Panel" onEventTokens="panelId= my_custom_status_bar" toVariant="@id/hidden_variant"/>
</Transitions>
</SystemBar>
Menyediakan UI kolom sistem dengan Dagger
Setelah menentukan kolom sistem dalam XML, berikan View dan Window yang sebenarnya.
Untuk melakukannya, terapkan penggantian aplikasi ke modul Dagger default, CarSystemBarModule.java. Contoh:
import com.android.systemui.car.systembar.CarSystemBarViewSupplier;
import com.android.systemui.car.systembar.CarSystemBarWindowSupplier;
import com.android.systemui.car.systembar.CarSystemBarWindowSupplierUsingLayout;
import com.example.R;
import dagger.Module;
import dagger.Provides;
import dagger.multibindings.IntoMap;
import dagger.multibindings.StringKey;
@Module
public abstract class MySystemBarModule extends CarSystemBarModule {
@Provides
@IntoMap
@StringKey("my_custom_status_bar") // Matches the <SystemBar> id
static CarSystemBarViewSupplier bindMyCustomStatusBarViewSupplier() {
return new CarSystemBarViewSupplierUsingLayout(
R.layout.my_custom_status_bar, // provisioned layout
R.layout.my_custom_status_bar_unprovisioned // unprovisioned layout
);
}
@Provides
@IntoMap
@StringKey("my_custom_status_bar") // Matches the <SystemBar> id
static CarSystemBarWindowSupplier bindMyCustomStatusBarWindowSupplier() {
return new CarSystemBarWindowSupplierUsingLayout(
R.layout.my_navigation_bar_window, // Can reuse existing window layouts
R.id.my_custom_bar_window // The ID that will be assigned to the window
);
}
}
Membuat modul Dagger dalam penggantian SystemUI
Untuk memperluas resource tata letak kustom, gunakan class CarSystemBarViewSupplierUsingLayout dan CarSystemBarWindowSupplierUsingLayout.
Buat modul Dagger untuk menyediakan supplier kustom Anda. @StringKey harus
cocok dengan id di tag XML <SystemBar>.
Untuk mengganti CarSystemBarModule, lihat contoh kode ini:
import com.android.systemui.car.systembar.CarSystemBarViewSupplier;
import com.android.systemui.car.systembar.CarSystemBarWindowSupplier;
import com.android.systemui.car.systembar.CarSystemBarWindowSupplierUsingLayout;
import com.example.R;
import dagger.Module;
import dagger.Provides;
import dagger.multibindings.IntoMap;
import dagger.multibindings.StringKey;
@Module
public abstract class MySystemBarModule extends CarSystemBarModule {
@Provides
@IntoMap
@StringKey("my_custom_status_bar") // Matches the <SystemBar> id
static CarSystemBarViewSupplier bindMyCustomStatusBarViewSupplier() {
return new CarSystemBarViewSupplierUsingLayout(
R.layout.my_custom_status_bar, // provisioned layout
R.layout.my_custom_status_bar_unprovisioned // unprovisioned layout
);
}
@Provides
@IntoMap
@StringKey("my_custom_status_bar") // Matches the <SystemBar> id
static CarSystemBarWindowSupplier bindMyCustomStatusBarWindowSupplier() {
return new CarSystemBarWindowSupplierUsingLayout(
R.layout.my_navigation_bar_window, // Can reuse existing window layouts
R.id.my_custom_bar_window // The ID that will be assigned to the window
);
}
}
Menggunakan RRO untuk membuat konfigurasi tingkat sistem
Tetapkan beberapa konfigurasi tingkat sistem yang memengaruhi kolom sistem dalam file res/values/config.xml di RRO Anda.
Menonaktifkan kolom sistem lama
Untuk mencegah konflik dengan UI yang Dapat Diskala, nonaktifkan konfigurasi kolom sistem lama dengan menetapkan flag berikut ke false:
<resources>
<bool name="config_enableTopSystemBar">false</bool>
<bool name="config_enableBottomSystemBar">false</bool>
<bool name="config_enableLeftSystemBar">false</bool>
<bool name="config_enableRightSystemBar">false</bool>
</resources>
Lokasi indikator privasi
Resource string config_privacyIndicatorLocation menentukan kolom sistem mana yang menghosting indikator privasi. Nilainya harus berupa nama id dari <SystemBar>.
<resources>
<!-- "my_custom_status_bar" corresponds to the android:id name of a SystemBar -->
<string name="config_privacyIndicatorLocation">my_custom_status_bar</string>
</resources>
Pemroses peristiwa tarik
Konfigurasi ini menentukan kolom sistem mana yang memproses peristiwa tarik (misalnya, untuk menggeser ke bawah guna membuka panel notifikasi). Mulai Android Automotive OS dengan UI yang Dapat Diskala, gunakan atribut XML sebagai default, bukan array resource penemuan yang didorong untuk menentukan kemampuan ini.
Direkomendasikan: Penemuan berbasis XML (UI yang Dapat Diskala)
Gunakan atribut dragOpenNotification dan dragCloseNotification langsung
di tag <SystemBar> di dalam XML overlay:
<SystemBar id="@id/my_custom_status_bar" type="status" barZOrder="0" defaultVariant="@id/default_variant" dragOpenNotification="true">
<Variant id="@+id/default_variant">
<Bounds top="0px" left="0px" right="100%" height="100px"/>
<Visibility isVisible="true"/>
</Variant>
</SystemBar>
Lama: Array resource (fallback)
Jika Anda mempertahankan build UI yang tidak Dapat Diskala atau perlu menentukan pemroses untuk perangkat yang kompatibel dengan versi sebelumnya, gunakan pendekatan string-array lama di res/values/config.xml di RRO Anda. Resource string-array ini menentukan kolom sistem mana yang memproses peristiwa tarik. Misalnya, untuk membuka panel notifikasi. Setiap <item> adalah nama id kolom sistem.
config_registerHvacDragCloseListenerconfig_notificationDragOpenListenerconfig_notificationDragCloseListener
Contoh:
<resources>
<string-array name="config_notificationDragOpenListener" translatable="false">
<item>my_custom_status_bar</item>
</string-array>
</resources>
Mem-build dan men-deploy
Untuk mem-build dan men-deploy kolom status:
Flash perangkat dengan aplikasi penggantian SystemUI yang telah diubah.
Gunakan sistem build Android (
m) untuk mengompilasi project RRO.Deploy APK RRO yang dihasilkan ke perangkat Android Automotive. Gunakan
adb installatau flash build lengkap yang menyertakan RRO Anda.