खास जानकारी

कार की सेटिंग (packages/apps/Car/Settings) खास तौर पर, Android Automotive OS (AAOS) के लिए उपलब्ध है. कार की सेटिंग, फ़ोन की सेटिंग (packages/apps/Settings) से अलग होती है. हालांकि, कार की सेटिंग में फ़ोन की कुछ सेटिंग होती हैं, लेकिन कार की सेटिंग में कार के हिसाब से विज़ुअल यूज़र इंटरफ़ेस, ड्राइवर का ध्यान भटकाने वाली चीज़ों को ऑप्टिमाइज़ करने की सुविधा, और OEM के लिए पसंद के मुताबिक बनाने के कई एंट्री पॉइंट होते हैं.

यहां दी गई कार सेटिंग की खास जानकारी के अलावा, कार सेटिंग के बारे में ज़्यादा जानने के लिए, इन मिलते-जुलते विषयों को देखें:

आर्किटेक्चर और दिशा-निर्देश

कार की सेटिंग में मौजूद ज़्यादातर पेजों को फ़्रैगमेंट की एक सीरीज़ के तौर पर लागू किया जाता है, जो SettingsFragment को एक्सटेंड करते हैं. हर पेज की अपनी गतिविधि होती है, जिसे CarSettingActivities में तय किया जाता है. ये स्टैटिक गतिविधियां, BaseCarSettingsActivity से एक्सटेंड की गई हैं. हालांकि, इस नियम के कुछ अपवाद हैं. जैसे, SettingsFragment के बजाय BaseFragment को एक्सटेंड करने वाले कुछ खास फ़्रैगमेंट और CarSettingActivities के बाहर मौजूद कुछ गतिविधियां. इन सभी को अपवाद माना जाना चाहिए, न कि फ़ॉलो किए जाने वाले पैटर्न के तौर पर.

स्टैटिक सेटिंग

स्टैटिक प्राथमिकता को एक्सएमएल में Preference या CarUiPreference टैग का इस्तेमाल करके तय किया जाता है. SettingsFragment लागू करने के लिए, getPreferenceScreenResId() तरीका इस्तेमाल किया जाता है. इससे यह तय किया जाता है कि किस एक्सएमएल फ़ाइल में, दिखाने के लिए प्राथमिकताओं की स्टैटिक सूची शामिल है.

डाइनैमिक प्राथमिकताएं

डाइनैमिक प्राथमिकताएं, PreferenceGroup टैग या PreferenceGroup के लागू होने का इस्तेमाल करती हैं.

CarSettings ऐप्लिकेशन में, डाइनैमिक प्राथमिकताएं, प्राथमिकताओं के सामान्य सेट को दिखाती हैं. ये प्राथमिकताएं, उपयोगकर्ता को CarSettings में मौजूद अन्य पेजों पर ले जाती हैं. हालांकि, इन्हें एक्सएमएल के बजाय Preference Controller के ज़रिए जोड़ा गया है. उदाहरण के लिए, भाषाएं और इनपुट सेटिंग में मौजूद, कीबोर्ड मैनेज करें सेटिंग. यह सेटिंग, इनपुट के तरीकों को अनुमति मिलने या न मिलने के आधार पर, सेटिंग पेज पर इनपुट के तरीके डाइनैमिक तौर पर जोड़ती है.

ऐक्शन बार

हर सेटिंग स्क्रीन के सबसे ऊपर एक ऐक्शन बार होता है. इसमें "वापस जाएं" नेविगेशन, स्क्रीन का टाइटल, और ऐक्शन से जुड़े अन्य विजेट (उदाहरण के लिए, बटन और स्विच) हो सकते हैं. ये ऐक्शन बार, Android के ActionBar के जैसे ही होते हैं. हालांकि, ये असल में कस्टम व्यू होते हैं. Android 11 और उसके बाद के वर्शन में, यह टूलबार चेसिस बेस लेआउट में शामिल होता है. इसमें टूलबार के व्यू और ऐप्लिकेशन के बाकी कॉन्टेंट के लिए फ़्रेमलेआउट शामिल होता है.

अन्य कार्रवाई वाले विजेट, मेन्यू आइटम क्लास होते हैं. इन्हें SettingsFragment या BaseFragment के onCreate में बनाया जाना चाहिए. दिखने की स्थिति, स्टेटस वगैरह जैसी प्रॉपर्टी को SettingsFragment के कारोबारी लॉजिक में सेटर से कंट्रोल किया जाना चाहिए.

// ExampleSettingsFragment.java
public class ExampleSettingsFragment extends SettingsFragment {

    @Override
    protected List<MenuItem> getToolbarMenuItems() {
        return Collections.singletonList(mClearConfirmButton);
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mButton = new MenuItem.Builder(getContext())
                .setTitle(R.string.text)
                .setOnClickListener(mOnClickListener)
                .setUxRestrictions(CarUxRestrictions.UX_RESTRICTIONS_NO_SETUP)
                .build();
    }

    private void updateState() {
        button.setVisible(false);
    }
}

ऐक्शन बार में, कार की सेटिंग में ध्यान भटकाने वाली चीज़ों को ऑप्टिमाइज़ करने की सुविधा काम करती है. MenuItem.Builder में, क्रिएशन के समय UX की पाबंदियां सेट करें.

प्राथमिकता कंट्रोल करने वाले

हर सेटिंग पेज पर कई तरह की प्राथमिकताएं हो सकती हैं.

इन कॉम्पोनेंट के बीच के संबंध के बारे में जानने के लिए, यह इमेज देखें:

CarSettings कॉम्पोनेंट

पहली इमेज. CarSettings के कॉम्पोनेंट

PreferenceController, लाइफ़साइकल के बारे में जानकारी रखने वाला कॉम्पोनेंट है. इससे, खास प्राथमिकताओं से जुड़े कारोबारी लॉजिक को शामिल करने में मदद मिलती है. PreferenceControllers को सिर्फ़ एक्सएमएल की मदद से, काम की प्राथमिकता से अटैच किया जा सकता है.

// example_settings_fragment.xml
<PreferenceScreen
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:settings="http://schemas.android.com/apk/res-auto"
    android:title="@string/example_settings_title">
  <Preference
    android:key="@string/pk_example_preference_key"
    android:title="@string/example_preference_title"
    settings:controller="com.android.car.settings.example.ExamplePreferenceController"/>
</PreferenceScreen>

कार की सेटिंग, PreferenceController थ्रू कोड बनाने से साफ़ तौर पर रोकती है. इससे, Java कोड में कम से कम बदलाव करके, सेटिंग के लेआउट में आसानी से बदलाव किया जा सकता है.

ऐसा हो सकता है कि PreferenceController को सही तरीके से काम करने के लिए, कुछ डाइनैमिक डेटा की ज़रूरत हो. उदाहरण के लिए, किसी ऐप्लिकेशन के लिए सूचनाएं बंद करने वाले PreferenceController को यह पता होना चाहिए कि किस ऐप्लिकेशन पर कार्रवाई करनी है. PreferenceControllers हमेशा एक्सएमएल में तय किए जाते हैं. इसलिए, कॉन्स्ट्रक्टर के लिए अतिरिक्त आर्ग्युमेंट देने का कोई तरीका नहीं है. इसके बजाय, ये अतिरिक्त वैल्यू PreferenceController पर मौजूद सार्वजनिक सेटर के ज़रिए दी जाती हैं. साथ ही, SettingsFragment से use(...) तरीके का इस्तेमाल करके सेट की जाती हैं.

// ExamplePreferenceController.java
public class ExamplePreferenceContorller extends PreferenceController<Preference> {

  private ExampleArg mExampleArg;

  public ExamplePreferenceController(...) {
    ...
  }

  public void setExampleArg(ExampleArg exampleArg) {
    mExampleArg = exampleArg;
  }
}

// ExampleSettingsFragment.java
public class ExampleSettingsFragment extends SettingsFragment {

  @Override
  @XmlRes
  protected int getPreferenceScreenResId() {
    Return R.xml.example_settings_fragment;
  }

  @Override
  public void onAttach(Context context) {
    ExampleArg arg = (ExampleArg) getArguments().getSerializeable(ARG_KEY);
    ExamplePreferenceController controller =
        use(ExamplePreferenceController.class, R.string.pk_example_preference_key);
    controller.setExampleArg(arg);
  }
}

use(...) तरीके का ज़्यादा इस्तेमाल करने पर, Java कोड में कम से कम बदलाव करके, सेटिंग के लेआउट को फिर से व्यवस्थित करने के मूल लक्ष्य को बनाए रखना मुश्किल हो जाता है. इसकी वजह यह है कि मौजूदा फ़्रैगमेंट कोड के बड़े सेक्शन को, नए बनाए गए फ़्रैगमेंट में कॉपी करना पड़ता है. इस काम को आसान बनाने के लिए, यह तरीका अपनाएं:

  • use(...) का इस्तेमाल कम से कम करें.
  • फ़्रैगमेंट में use(...) को हर कॉल एक ही जगह पर रखने की कोशिश करें (उदाहरण के लिए, onAttach() तरीके में).

इंटेंट मैनेज करना

कार सेटिंग ऐप्लिकेशन को मैनेज करने वाले सभी इंटेंट के बारे में, मेनिफ़ेस्ट फ़ाइल में बताया गया है. आम तौर पर, इंटेंट को ज़्यादातर स्टैंडर्ड Android ऐप्लिकेशन की तरह ही तय और मैनेज किया जाता है. साथ ही, मेनिफ़ेस्ट में बताई गई सभी गतिविधियों और इंटेंट फ़िल्टर के साथ.

रूट फ़्रैगमेंट बदलना

अगर ज़रूरत हो, तो config_show_settings_root_exit_icon का इस्तेमाल करके, 'बाहर निकलें' आइकॉन को दिखाया या छिपाया जा सकता है.

थीम को पसंद के मुताबिक बनाना

अन्य एट्रिब्यूट और संसाधनों को पसंद के मुताबिक बनाना

कार सेटिंग ऐप्लिकेशन मुख्य रूप से CarSettingTheme का इस्तेमाल करता है, जो Theme.CarUi का एक्सटेंशन है. इस थीम का इस्तेमाल, सिस्टम ऐप्लिकेशन के लुक-एंड-फ़ील को स्टैंडर्ड बनाने के लिए किया जाता है, ताकि सिस्टम में एक जैसा अनुभव मिल सके.

प्राथमिकताएं पसंद के मुताबिक बनाना

प्राथमिकताओं को पसंद के मुताबिक बनाने की सुविधा, इन अन्य जगहों पर भी उपलब्ध है:

  • कुछ बुनियादी प्राथमिकता क्लास का लेआउट, car_preference में तय किया गया है और कार के बिल्ड के लिए ओवरले किया गया है. यहां, बुनियादी प्राथमिकता क्लास के लिए पसंद के मुताबिक बनाए गए किसी भी लेआउट को बदला जा सकता है.
  • कार की सेटिंग में, मुख्य रूप से common पैकेज में तय की गई कुछ पसंद के मुताबिक प्राथमिकताओं का इस्तेमाल किया जाता है. इन्हें कार की सेटिंग मॉड्यूल में, बेस प्राथमिकता क्लास से अलग ओवरले किया जाना चाहिए.