सिस्टम बार को पसंद के मुताबिक बनाने के लिए, यूज़र इंटरफ़ेस (यूआई) कॉम्पोनेंट में एक्सएमएल कॉन्फ़िगरेशन और Dagger मॉड्यूल के कॉम्बिनेशन का इस्तेमाल करें.
सिस्टम बार के व्यवहार को तय करना
सिस्टम बार तय करने के लिए, एक्सएमएल फ़ाइल में <SystemBar> टैग का इस्तेमाल करें. इससे, सिस्टम बार के दिखने के तरीके और ऐनिमेशन को तय किया जा सकता है. यह एक्सएमएल फ़ाइल, रनटाइम रिसॉर्स ओवरले (आरआरओ) का हिस्सा है.
SystemBar टैग के एट्रिब्यूट
सिस्टम बार के कॉन्फ़िगरेशन के लिए, रूट एलिमेंट <SystemBar> होता है. यह
इन एट्रिब्यूट के साथ काम करता है:
| एट्रिब्यूट | स्थिति | ब्यौरा |
|---|---|---|
id |
ज़रूरी है | सिस्टम बार के लिए यूनीक रिसॉर्स आईडी. उदाहरण के लिए,
@id/my_custom_status_bar |
type |
ज़रूरी है | इससे सिस्टम बार का टाइप तय होता है. यह
status या navigation हो सकता है |
barZOrder |
ज़रूरी है | यह पूर्णांक, सिस्टम बार के Z-ऑर्डर को दिखाता है. ज़्यादा वैल्यू से पता चलता है कि सिस्टम, बार को अन्य बार के ऊपर दिखाता है. यह पॉज़िटिव पूर्णांक होना चाहिए. ये नियम लागू होते हैं:
|
defaultVariant |
ज़रूरी है | यह <Variant> का आईडी है. सिस्टम बार के शुरू होने पर, यह डिफ़ॉल्ट रूप से लागू होता है |
displayId |
वैकल्पिक | यह <Variant> का आईडी है. सिस्टम बार के शुरू होने पर, यह डिफ़ॉल्ट रूप से लागू होता है |
hideForKeyboard |
वैकल्पिक |
यह बूलियन वैल्यू जब इस एट्रिब्यूट की वैल्यू |
dragOpenNotification |
वैकल्पिक |
यह बूलियन वैल्यू |
dragCloseNotification |
वैकल्पिक |
यह बूलियन वैल्यू |
सिस्टम बार के आईडी और टाइप
TopCarSystemBar, BottomCarSystemBar, LeftCarSystemBar, और RightCarSystemBar को id वैल्यू के तौर पर इस्तेमाल न करें. सिस्टम, इन आईडी को बैकवर्ड कंपैटिबिलिटी के लिए रिज़र्व रखता है. इनका इस्तेमाल करने पर, अनचाहा व्यवहार हो सकता है.
बेसिक टॉप स्टेटस बार और बॉटम नेविगेशन बार के कॉन्फ़िगरेशन के लिए, type एट्रिब्यूट की वैल्यू के तौर पर क्रमशः status और nav का इस्तेमाल करें.
अगर इन आईडी का इस्तेमाल किया जाता है, तो Dagger की मदद से सिस्टम बार का यूज़र इंटरफ़ेस (यूआई) उपलब्ध कराना सेक्शन को छोड़ा जा सकता है.
<Variant>- इससे विज़ुअल स्टेट तय होती हैं. ज़्यादा जानने के लिए, विज़ुअल स्टेट
डिज़ाइन करने के लिए वैरिएंट का इस्तेमाल करना लेख पढ़ें.
<SystemBar>टैग में, एक या उससे ज़्यादा<Variant>टैग तय करें. हर वैरिएंट, अलग-अलग विज़ुअल स्टेट दिखाता है. इसमें ऐसी प्रॉपर्टी शामिल होती हैं जिनसे उस स्टेट में सिस्टम बार के दिखने के तरीके को कंट्रोल किया जाता है. <Visibility isVisible="true|false">- इससे सिस्टम बार की विज़िबिलिटी को कंट्रोल किया जाता है.
isVisibleबूलियन से पता चलता है कि सिस्टम बार दिख रहा है या नहीं. <Alpha alpha="float_value">- इससे सिस्टम बार की पारदर्शिता को कंट्रोल किया जाता है.
alphaकी वैल्यू,0.0(पूरी तरह पारदर्शी) और1.0(पूरी तरह अपारदर्शी) के बीच होती है. <Bounds .../>इससे सिस्टम बार की पोज़िशन और साइज़ तय होता है.
<SystemBar>एलिमेंट के लिए, बाउंड्री ज़रूर डिसप्ले के कम से कम एक किनारे (बाएं, ऊपर, दाएं या नीचे) को टच करनी चाहिए. एट्रिब्यूट ये हैं:left,top,right,bottom: ऐब्सलूट कोऑर्डिनेट.width,height: डाइमेंशन.leftOffset,topOffset,rightOffset,bottomOffset: ऑफ़सेट, रेक्टैंगल के सेंटर की ओर.
<Corner radius="dimen"/>इससे सिस्टम बार का कॉर्नर रेडियस तय होता है.
radiusके लिए, कॉर्नर रेडियस का डाइमेंशन डालें.<Insets .../>इससे सिस्टम बार के लिए इनसेट तय होते हैं. एट्रिब्यूट,
left,top,right, औरbottomहैं. हर एट्रिब्यूट के लिए, इनसेट की डाइमेंशन वैल्यू डालें.<Gravity .../>इससे सिस्टम बार के कॉन्टेंट की ग्रैविटी तय होती है. ज़्यादा जानने के लिए, सोर्स कोड में
HunTagXmlParserKt.GRAVITY_TAGदेखें.- ग्रैविटी के लिए कोई वैल्यू न देने पर, सिस्टम इसे इंटरनली कैलकुलेट करता है.
- इन वैल्यू के कॉम्बिनेशन इस्तेमाल किए जा सकते हैं:
TOP,BOTTOM,LEFT,RIGHT,CENTER,CENTER_HORIZONTAL,CENTER_VERTICAL, औरFILL_HORIZONTAL, हर वैल्यू को|वर्ण से अलग किया जाता है.
डाइमेंशन की इकाइयां
px, dp (या dip), % में डाइमेंशन तय करें. इसके अलावा, dimension, integer, fraction, string या attribute रिसॉर्स के रेफ़रंस भी इस्तेमाल किए जा सकते हैं.
ट्रांज़िशन: वैरिएंट के बीच ऐनिमेशन
ज़्यादा जानने के लिए, ट्रांज़िशन कॉन्फ़िगर करना लेख पढ़ें. <Transitions> ब्लॉक का इस्तेमाल करके, यह तय करें कि अलग-अलग वैरिएंट के बीच सिस्टम बार का ऐनिमेशन कैसे होगा:
| आइटम | टैग एट्रिब्यूट |
|---|---|
<Transition> |
fromVariant, toVariant, onEvent, onEventTokens, animator, duration, delay, interpolator |
<Transitions> |
defaultDuration, defaultInterpolator |
स्केलेबल यूज़र इंटरफ़ेस (यूआई), सिस्टम बार में ट्रांज़िशन की सुविधा सिर्फ़ तब देता है, जब इन्हें नॉन-इमर्सिव मोड के इस्तेमाल के मामलों के लिए तय किया जाता है. इसका मतलब है कि इमर्सिव मोड, सिस्टम बार को छिपाने (या दिखाने) पर, स्केलेबल यूज़र इंटरफ़ेस (यूआई) की विंडोइंग ट्रांज़िशन को ट्रिगर नहीं करता.
स्केलेबल यूज़र इंटरफ़ेस (यूआई), सिस्टम बार को छिपाने (या दिखाने) के लिए इवेंट भेजता रहता है, ताकि अन्य पैनल ज़रूरत के हिसाब से जवाब दे सकें. वहीं, hideForKeyboard एट्रिब्यूट के सही तरीके से काम करने के लिए, सिस्टम बार को छिपाने और दिखाने के लिए ट्रांज़िशन उपलब्ध कराने ज़रूरी हैं. एक्सएमएल के इस सैंपल स्ट्रक्चर को देखें:
<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>
Dagger की मदद से सिस्टम बार का यूज़र इंटरफ़ेस (यूआई) उपलब्ध कराना
एक्सएमएल में सिस्टम बार तय करने के बाद, असल View और Window उपलब्ध कराएं.
इसके लिए, डिफ़ॉल्ट Dagger मॉड्यूल, CarSystemBarModule.java पर ऐप्लिकेशन ओवरराइड लागू करें. उदाहरण के लिए:
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
);
}
}
SystemUI ओवरराइड में Dagger मॉड्यूल बनाना
अपने कस्टम लेआउट रिसॉर्स को इन्फ़्लेट करने के लिए, CarSystemBarViewSupplierUsingLayout और CarSystemBarWindowSupplierUsingLayout क्लास का इस्तेमाल करें.
अपने कस्टम सप्लायर उपलब्ध कराने के लिए, Dagger मॉड्यूल बनाएं. @StringKey को आपके <SystemBar> एक्सएमएल टैग में मौजूद id से मेल खाना चाहिए.
CarSystemBarModule को ओवरराइड करने के लिए, कोड का यह सैंपल देखें:
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
);
}
}
सिस्टम-लेवल का कॉन्फ़िगरेशन बनाने के लिए, आरआरओ का इस्तेमाल करना
अपने आरआरओ में मौजूद res/values/config.xml फ़ाइल में, सिस्टम-लेवल के कई कॉन्फ़िगरेशन सेट करें. इनसे सिस्टम बार पर असर पड़ता है.
लेगसी सिस्टम बार बंद करना
स्केलेबल यूज़र इंटरफ़ेस (यूआई) के साथ टकराव से बचने के लिए, लेगसी सिस्टम बार के कॉन्फ़िगरेशन बंद करें. इसके लिए, इन फ़्लैग को 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>
निजता इंडिकेटर की जगह
config_privacyIndicatorLocation स्ट्रिंग रिसॉर्स से पता चलता है कि निजता इंडिकेटर किस सिस्टम बार पर दिखते हैं. इसकी वैल्यू, id का <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>
ड्रैग इवेंट लिसनर
इन कॉन्फ़िगरेशन से पता चलता है कि कौनसे सिस्टम बार, ड्रैग इवेंट के लिए लिसनर के तौर पर काम करते हैं. उदाहरण के लिए, नोटिफ़िकेशन पैनल खोलने के लिए नीचे की ओर स्वाइप करना. स्केलेबल यूज़र इंटरफ़ेस (यूआई) के साथ Android Automotive OS में, इन क्षमताओं को तय करने के लिए, डिस्कवरी रिसॉर्स ऐरे के बजाय एक्सएमएल एट्रिब्यूट को डिफ़ॉल्ट के तौर पर इस्तेमाल करें.
सुझाव: एक्सएमएल-ड्रिवन डिस्कवरी (स्केलेबल यूज़र इंटरफ़ेस (यूआई))
अपने ओवरले एक्सएमएल में मौजूद <SystemBar> टैग में, dragOpenNotification और dragCloseNotification एट्रिब्यूट का सीधे तौर पर इस्तेमाल करें:
<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>
लेगसी: रिसॉर्स ऐरे (फ़ॉलबैक)
अगर स्केलेबल यूज़र इंटरफ़ेस (यूआई) के बिना कोई बिल्ड बनाए रखा जा रहा है या बैकवर्ड-कंपैटिबल डिवाइसों के लिए लिसनर तय करने हैं, तो अपने आरआरओ में मौजूद res/values/config.xml में, लेगसी string-array तरीका इस्तेमाल करें. इन string-array रिसॉर्स से पता चलता है कि कौनसे सिस्टम बार, ड्रैग इवेंट के लिए लिसनर के तौर पर काम करते हैं. उदाहरण के लिए, नोटिफ़िकेशन पैनल खोलना. हर <item>, सिस्टम बार का id नाम होता है.
config_registerHvacDragCloseListenerconfig_notificationDragOpenListenerconfig_notificationDragCloseListener
उदाहरण के लिए:
<resources>
<string-array name="config_notificationDragOpenListener" translatable="false">
<item>my_custom_status_bar</item>
</string-array>
</resources>
बिल्ड और डिप्लॉय करना
स्टेटस बार को बिल्ड और डिप्लॉय करने के लिए:
अपने बदले गए SystemUI ओवरराइड ऐप्लिकेशन को डिवाइस पर फ़्लैश करें.
अपने आरआरओ प्रोजेक्ट को कंपाइल करने के लिए, Android बिल्ड सिस्टम (
m) का इस्तेमाल करें.जनरेट किए गए आरआरओ एपीके को अपने Android Automotive डिवाइस पर डिप्लॉय करें.
adb installका इस्तेमाल करें या अपने आरआरओ वाले पूरे बिल्ड को फ़्लैश करें.