कार की सेटिंग में मौजूद ज़्यादातर पेजों को SettingsFragment
को बढ़ाने वाले फ़्रैगमेंट की सीरीज़ के तौर पर लागू किया जाता है. इनमें से हर पेज के लिए CarSettingActivities
में एक गतिविधि तय की जाती है.
ये स्टैटिक गतिविधियां BaseCarSettingsActivity
से शुरू होती हैं.
इन सेटिंग के अलावा, CarSettings में दिखने के लिए, अन्य सिस्टम ऐप्लिकेशन की प्राथमिकताएं भी जोड़ी जा सकती हैं.
कार की सेटिंग में नई प्राथमिकता जोड़ना
नई सेटिंग जोड़ने के लिए:
- एक्सएमएल फ़ाइल तय करें:
- पक्का करें कि सभी प्राथमिकताओं में
android:key
तय किया गया हो. कुंजियों की सूची,preference_keys.xml
में रखी जाती है. प्राथमिकताएं कुंजियां यूनीक होनी चाहिए. - खोज को इंडेक्स करने के लिए, प्राथमिकता वाली स्क्रीन में भी एक तय
android:key
होना चाहिए. प्राथमिकता स्क्रीन की कुंजियों की सूची,preference_screen_keys.xml
में रखी जाती है. प्राथमिकता स्क्रीन की कुंजियां भी यूनीक होनी चाहिए. - अगर प्राथमिकता सिर्फ़ स्टैटिक जानकारी दिखाती है, जैसे कि कोई खास कारोबारी लॉजिक नहीं है, तो प्राथमिकता कंट्रोलर को
com.android.car.settings.common.DefaultRestrictionsPreferenceController
के तौर पर सेट करें. - अगर प्राथमिकता के लिए कारोबारी लॉजिक की ज़रूरत है, तो प्राथमिकता कंट्रोलर को नए नाम के साथ सेट करें.
- पक्का करें कि सभी प्राथमिकताओं में
- (अगर ज़रूरी हो) सही पैकेज में प्राथमिकता कंट्रोलर बनाएं, जो
PreferenceController
को बढ़ाता है. अगर ज़रूरी हो, तो Javadoc देखें. - पहले चरण में बताई गई एक्सएमएल फ़ाइल दिखाने वाले
getPreferenceScreenResId
के साथ फ़्रैगमेंट बनाएं. CarSettingActivities
में ऐसी ऐक्टिविटी बनाएं जोBaseCarSettingsActivity
को एक्सटेंड करती हो. इसके बाद,getInitialFragment()
को लागू करें. इससे तीसरे चरण में तय किया गया फ़्रैगमेंट दिखेगा.- चौथे चरण में बताई गई गतिविधि को शामिल करने के लिए,
AndroidManifest.xml
को अपडेट करें.
उदाहरण
इस प्रोसेस के बारे में यहां बताया गया है.
demo_fragment.xml
नाम की एक्सएमएल फ़ाइल तय करें:<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" xmlns:settings="http://schemas.android.com/apk/res-auto" android:title="@string/demo_label" android:key="@string/psk_demo"> <Preference android:icon="@drawable/ic_settings_demo_preference_1" android:key="@string/pk_demo_preference_1" android:title="@string/demo_preference_1_title" settings:controller="com.android.car.settings.common.DefaultRestrictionsPreferenceController"> <intent android:targetPackage="com.android.car.settings" android:targetClass="com.android.car.settings.common.CarSettingActivities$DemoSetting1Activity"/> </Preference> <Preference android:icon="@drawable/ic_settings_demo_preference_2" android:key="@string/pk_demo_preference_2" android:title="@string/demo_preference_2_title" settings:controller="com.android.car.settings.example.MyCustomRestrictionsPreferenceController"> <intent android:targetPackage="com.android.car.settings" android:targetClass="com.android.car.settings.common.CarSettingActivities$DemoSetting2Activity"/> </Preference> </PreferenceScreen>
preference_keys
में प्राथमिकता कुंजियां जोड़ें:<resources> [...] <string name="pk_demo_preference_1" translatable="false">demo_preference_1</string> <string name="pk_demo_preference_2" translatable="false">demo_preference_2</string> </resources>
preference_screen_keys.xml
में, प्राथमिकता स्क्रीन की कुंजी जोड़ें:<resources> [...] <string name="psk_demo" translatable="false">demo_screen</string> </resources>
पहले उदाहरण के लिए,
DefaultRestrictionsPreferenceController
का इस्तेमाल करें. दूसरी प्राथमिकता के लिए, कस्टम प्राथमिकता कंट्रोलर का इस्तेमाल करें. इसे तय करना ज़रूरी है. इस उदाहरण के लिए, इस सेटिंग को सिर्फ़ उपलब्ध एडमिन उपयोगकर्ताओं के लिए पसंद के मुताबिक बनाया जा सकता है. ऐसा करने के लिए, यह कस्टम कंट्रोलर तय करें:public class MyCustomRestrictionsPreferenceController extends PreferenceController<Preference> { private final UserManager mUserManager; public MyCustomRestrictionsPreferenceController(Context context, String preferenceKey, FragmentController fragmentController, CarUxRestrictions uxRestrictions) { super(context, preferenceKey, fragmentController, uxRestrictions); mUserManager = UserManager.get(context); } @Override protected Class<Preference> getPreferenceType() { return Preference.class; } @Override public int getAvailabilityStatus() { return mUserManager.isAdminUser() ? AVAILABLE : DISABLED_FOR_USER; } }
- फ़्रैगमेंट बनाने के लिए,
getPreferenceScreenResId
को बदलें: - नए फ़्रैगमेंट को होल्ड करने के लिए,
CarSettingActivities
में कोई गतिविधि बनाएं: - नई गतिविधि के साथ मेनिफ़ेस्ट फ़ाइल को अपडेट करें:
- सीधे CarSettings ऐप्लिकेशन में लागू नहीं की गई हो. जैसे, OEM की ओर से लागू की गई सेटिंग को इंजेक्ट करना.
- यह CarSettings ऐप्लिकेशन में दिखना चाहिए.
- गतिविधि को इंजेक्ट की गई सेटिंग के तौर पर मार्क करने के लिए, गतिविधि में इंटेंट-फ़िल्टर जोड़ें.
- CarSettings ऐप्लिकेशन को बताएं कि वह किस कैटगरी का है. कैटगरी एक स्थिर वैल्यू होती है, जिसे
CategoryKey
में तय किया जाता है. इसका इस्तेमाल यह बताने के लिए किया जाता है कि इंजेक्ट की गई सेटिंग, CarSettings के किस लेवल पर दिखनी चाहिए. हमCategoryKey
में कैटगरी का एक सेट उपलब्ध कराते हैं. हालांकि, OEM के पास अपनी कैटगरी तय करने की कोई पाबंदी नहीं है. - (ज़रूरी नहीं) सेटिंग दिखने पर खास जानकारी वाला टेक्स्ट जोड़ें:
<activity android:name="Settings$DemoSettingsActivity" <!-- Mark the activity as an injected setting --> <intent-filter> <action android:name="com.android.settings.action.EXTRA_SETTINGS"/> </intent-filter> <!-- Tell CarSettings app which category it belongs to --> <meta-data android:name="com.android.settings.category" android:value="com.android.settings.category.demo_category"/> <!-- Tell CarSettings the what the preference title should be --> <meta-data android:name="com.android.settings.title" android:value="@string/app_name" /> <!-- Optional: specify the icon to show with the preference --> <meta-data android:name="com.android.settings.icon" android:resource="@drawable/ic_demo" android:value="true"/> <!-- Optional: Add a summary text when the string is displayed --> <meta-data android:name="com.android.settings.summary" android:resource="@string/demo_summary"/> </activity>
public class DemoFragment extends SettingsFragment { @Override @XmlRes protected int getPreferenceScreenResId() { return R.xml.demo_fragment; } }
public class CarSettingActivities { [...] public static class DemoActivity extends BaseCarSettingsActivity { @Nullable @Override protected Fragment getInitialFragment() { return new DemoFragment(); } } }
<application [...] <activity android:name=".common.CarSettingActivities$DemoActivity" android:exported="true"> <meta-data android:name="distractionOptimized" android:value="true"/> </activity> [...] </application>
कार की सेटिंग में, बाहरी इंटेंट की प्राथमिकता जोड़ना
इंजेक्ट की गई प्राथमिकताओं के विकल्प के तौर पर, सीधे कार की सेटिंग में भी प्राथमिकता जोड़ी जा सकती है. यह प्राथमिकता, किसी दूसरे ऐप्लिकेशन पर ले जाती है. ऐसा करने के लिए, प्राथमिकता स्क्रीन में कोई प्राथमिकता जोड़ें. यह प्राथमिकता, किसी बाहरी ऐप्लिकेशन पर ले जाने वाली इंटेंट कार्रवाई के साथ होनी चाहिए. कार की सेटिंग में मौजूद अन्य प्राथमिकताओं की तरह, इन प्राथमिकताओं के लिए भी वही एक्सएमएल एट्रिब्यूट उपलब्ध होते हैं.
<Preference android:key="@string/pk_demo_preference" android:title="@string/demo_preference_title" android:summary="@string/demo_preference_summary" settings:controller="com.android.car.settings.common.DefaultRestrictionsPreferenceController"> <intent android:action="android.intent.action.DEMO_ACTION"/> </Preference>
इंजेक्ट की गई प्राथमिकता जोड़ना
इंजेक्ट की गई प्राथमिकताओं में, बाहरी या अंदरूनी गतिविधियों के लिए इंटेंट शामिल होते हैं. उदाहरण के लिए, सेटिंग होम पेज पर Google सेटिंग आइटम, इंजेक्ट की गई प्राथमिकता है. इंजेक्ट की गई प्राथमिकताएं खास तौर पर तब काम की होती हैं, जब इनमें से कोई भी बात सही हो. सेटिंग:
किसी गतिविधि को इंजेक्ट की गई सेटिंग के तौर पर कॉन्फ़िगर करने के लिए:
इंजेक्ट की गई सेटिंग को CarSettings ऐप्लिकेशन के किसी खास पेज पर दिखाने के लिए, एक्सएमएल में यह सैंपल कोड शामिल करें. साथ ही, ज़रूरत के हिसाब से वैरिएबल में बदलाव करें:
<com.android.car.settings.common.LogicalPreferenceGroup <!-- Replace key string --> android:key="@string/pk_system_extra_settings" <!-- Indicates the preferences in the group should be injected in. ExtraSettingsPreferenceController contains the logic to pull in injected preferences. --> settings:controller="com.android.settings.common.ExtraSettingsPreferenceController"> <!-- Tells the controller what activities should be pulled into this preference group. --> <intent android:action="com.android.settings.action.EXTRA_SETTINGS"> <!-- Name and value should match the metadata in your activity --> <extra android:name="com.android.settings.category" android:value="com.android.settings.category.demo_category"/> </intent> </com.android.car.settings.common.LogicalPreferenceGroup>