تنظیمات خودرو ( packages/apps/Car/Settings ) به طور خاص برای سیستم عامل Android Automotive (AAOS) ارائه شده است. تنظیمات خودرو با تنظیمات تلفن ( packages/apps/Settings ) متفاوت است. در حالی که «تنظیمات خودرو» حاوی برخی تنظیمات آشنای تلفن است، «تنظیمات خودرو» یک رابط کاربری بصری با خودرو ، بهینهسازیهای حواسپرتی راننده و نقاط ورودی سفارشیسازی متعددی برای OEMها ارائه میکند.
علاوه بر نمای کلی تنظیمات خودرو که در زیر ارائه شده است، برای کسب اطلاعات بیشتر در مورد تنظیمات خودرو، به این موضوعات مرتبط مراجعه کنید:
- افزودن تنظیمات خودرو
- تنظیم مجدد تنظیمات خودرو
- بهینه سازی حواس پرتی در تنظیمات خودرو
- نمایه سازی جستجوی تنظیمات خودرو
- سفارشی سازی دو صفحه
بیشتر صفحات در تنظیمات خودرو به صورت مجموعهای از قطعات پیادهسازی میشوند که SettingsFragment را گسترش میدهند و هر کدام فعالیت خاص خود را در CarSettingActivities تعریف میکنند. این فعالیت های ایستا از BaseCarSettingsActivity گسترش یافته است. در حالی که چند استثنا برای این قاعده وجود دارد، مانند برخی از قطعات خاص که BaseFragment را به جای SettingsFragment گسترش می دهند و برخی از فعالیت ها خارج از CarSettingActivities قرار دارند، که همه آنها باید به عنوان استثنا در نظر گرفته شوند (نه به عنوان الگوهایی که باید دنبال شوند).
یک اولویت ثابت در XML با استفاده از تگ Preference یا CarUiPreference تعریف می شود. اجرای SettingsFragment از متد getPreferenceScreenResId() استفاده می کند تا مشخص کند کدام فایل XML حاوی لیست ایستا ترجیحات برای نمایش است.
ترجیحات پویا از تگ PreferenceGroup یا پیاده سازی PreferenceGroup استفاده می کنند.
در برنامه CarSettings، تنظیمات برگزیده پویا مجموعهای عادی از اولویتها را نشان میدهد که کاربر را به صفحات اضافی در CarSettings هدایت میکند، اما از طریق کنترلکننده ترجیحی به جای XML اضافه شدهاند. به عنوان مثال، تنظیمات برگزیده Manage keyboards در زیر تنظیمات زبان و ورودی است که به صورت پویا روشهای ورودی را بر اساس مجاز بودن یا نبودن این روشهای ورودی به صفحه ترجیحی اضافه میکند.
بالای هر صفحه تنظیمات دارای یک نوار عمل است که میتواند شامل یک پیمایش «بازگشت»، عنوان صفحه و ابزارکهای اقدام تکمیلی (به عنوان مثال، دکمهها و سوئیچها) باشد. این نوارهای اکشن مشابه ActionBar ارائه شده توسط اندروید هستند، اما در واقع نماهای سفارشی هستند. در اندروید 11 و بالاتر، این نوار ابزار در چیدمان پایه شاسی گنجانده شده است که شامل نماهایی برای نوار ابزار و یک چارچوب برای بقیه محتوای برنامه است.
ویجت های اقدام تکمیلی کلاس های MenuItem هستند و باید در onCreate SettingsFragment یا BaseFragment مربوطه ایجاد شوند. ویژگی هایی مانند قابلیت مشاهده، حالت و غیره باید توسط تنظیم کننده ها در منطق تجاری 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); } }
نوارهای عمل با پشتیبانی از بهینه سازی حواس پرتی در تنظیمات خودرو ارائه می شوند. UXRestrictions را در MenuItem.Builder در هنگام ایجاد تنظیم کنید.
هر صفحه تنظیمات می تواند تعدادی تنظیمات برگزیده مختلف را در خود جای دهد.
برای چگونگی ارتباط این اجزاء به تصویر زیر نگاه کنید:
شکل 1. اجزای تنظیمات خودرو
PreferenceController یک جزء آگاه از چرخه حیات است که به کپسوله کردن منطق تجاری مربوط به Preferences خاص کمک می کند. PreferenceControllers فقط می توان از طریق XML به Preference مربوطه متصل کرد.
// 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 از طریق کد جلوگیری می کند تا اصلاح سلسله مراتب تنظیمات را با حداقل تغییرات در کد جاوا آسان تر کند.
این امکان وجود دارد که یک PreferenceController برای عملکرد صحیح به مقداری داده پویا نیاز داشته باشد. برای مثال، یک PreferenceController که اعلانهای یک برنامه را خاموش میکند، باید بداند روی کدام برنامه عمل کند. از آنجایی که PreferenceControllers همیشه در XML تعریف می شوند، راهی برای ارائه آرگومان های سازنده اضافی وجود ندارد. در عوض، این مقادیر اضافی از طریق تنظیم کننده های عمومی در PreferenceController ارائه می شوند و با استفاده از روش use(...) از SettingsFragment تنظیم می شوند.
// 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(...) استفاده شود، حفظ هدف اصلی یعنی امکان تنظیم مجدد سلسله مراتب تنظیمات با حداقل تغییرات در کد جاوا سخت تر می شود، زیرا بخش های بزرگی از کد قطعه موجود باید در قطعه جدید ایجاد شده کپی شود. یک راه برای به حداقل رساندن دشواری انجام این کار این است که:
- استفاده از
use(...). - سعی کنید هر فراخوانی برای
use(...)در یک مکان در قطعه نگه دارید (مثلاً در متدonAttach()).
تمام مقاصدی که باید توسط برنامه تنظیمات خودرو مدیریت شود در فایل مانیفست تعریف شده است. Intent ها به طور کلی مانند اکثر برنامه های استاندارد اندروید تعریف و مدیریت می شوند و تمام فعالیت ها و فیلترهای هدف در مانیفست تعریف شده اند.
در صورت تمایل، نماد خروج را می توان با استفاده از config_show_settings_root_exit_icon نمایش داده یا پنهان کرد.
برنامه تنظیمات خودرو در درجه اول از CarSettingTheme استفاده می کند که یک برنامه افزودنی Theme.CarUi است. این موضوع برای استاندارد کردن ظاهر و احساس برنامه های سیستم برای اطمینان از ثبات در سیستم استفاده می شود.
سفارشی کردن تنظیمات برگزیده شامل این مکانهای اضافی میشود:
- طرحبندی برخی از کلاسهای ترجیحی پایه در
car_preferenceتعریف شده و برای ساخت خودرو روی آن قرار گرفته است . هر طرحبندی سفارشیسازی برای کلاسهای ترجیحی پایه را میتوان در اینجا جایگزین کرد. - تنظیمات خودرو از برخی اولویتهای سفارشی استفاده میکند که عمدتاً در بسته
commonتعریف شدهاند. اینها باید در ماژول تنظیمات خودرو به طور جداگانه از کلاس های ترجیحی پایه همپوشانی شوند.
تنظیمات خودرو ( packages/apps/Car/Settings ) به طور خاص برای سیستم عامل Android Automotive (AAOS) ارائه شده است. تنظیمات خودرو با تنظیمات تلفن ( packages/apps/Settings ) متفاوت است. در حالی که «تنظیمات خودرو» حاوی برخی تنظیمات آشنای تلفن است، «تنظیمات خودرو» یک رابط کاربری بصری با خودرو ، بهینهسازیهای حواسپرتی راننده و نقاط ورودی سفارشیسازی متعددی برای OEMها ارائه میکند.
علاوه بر نمای کلی تنظیمات خودرو که در زیر ارائه شده است، برای کسب اطلاعات بیشتر در مورد تنظیمات خودرو، به این موضوعات مرتبط مراجعه کنید:
- افزودن تنظیمات خودرو
- تنظیم مجدد تنظیمات خودرو
- بهینه سازی حواس پرتی در تنظیمات خودرو
- نمایه سازی جستجوی تنظیمات خودرو
- سفارشی سازی دو صفحه
بیشتر صفحات در تنظیمات خودرو به صورت مجموعهای از قطعات پیادهسازی میشوند که SettingsFragment را گسترش میدهند و هر کدام فعالیت خاص خود را در CarSettingActivities تعریف میکنند. این فعالیت های ایستا از BaseCarSettingsActivity گسترش یافته است. در حالی که چند استثنا برای این قاعده وجود دارد، مانند برخی از قطعات خاص که BaseFragment را به جای SettingsFragment گسترش می دهند و برخی از فعالیت ها خارج از CarSettingActivities قرار دارند، که همه آنها باید به عنوان استثنا در نظر گرفته شوند (نه به عنوان الگوهایی که باید دنبال شوند).
یک اولویت ثابت در XML با استفاده از تگ Preference یا CarUiPreference تعریف می شود. اجرای SettingsFragment از متد getPreferenceScreenResId() استفاده می کند تا مشخص کند کدام فایل XML حاوی لیست ایستا ترجیحات برای نمایش است.
ترجیحات پویا از تگ PreferenceGroup یا پیاده سازی PreferenceGroup استفاده می کنند.
در برنامه CarSettings، تنظیمات برگزیده پویا مجموعهای عادی از اولویتها را نشان میدهد که کاربر را به صفحات اضافی در CarSettings هدایت میکند، اما از طریق کنترلکننده ترجیحی به جای XML اضافه شدهاند. به عنوان مثال، تنظیمات برگزیده Manage keyboards در زیر تنظیمات زبان و ورودی است که به صورت پویا روشهای ورودی را بر اساس مجاز بودن یا نبودن این روشهای ورودی به صفحه ترجیحی اضافه میکند.
بالای هر صفحه تنظیمات دارای یک نوار عمل است که میتواند شامل یک پیمایش «بازگشت»، عنوان صفحه و ابزارکهای اقدام تکمیلی (به عنوان مثال، دکمهها و سوئیچها) باشد. این نوارهای اکشن مشابه ActionBar ارائه شده توسط اندروید هستند، اما در واقع نماهای سفارشی هستند. در اندروید 11 و بالاتر، این نوار ابزار در چیدمان پایه شاسی گنجانده شده است که شامل نماهایی برای نوار ابزار و یک چارچوب برای بقیه محتوای برنامه است.
ویجت های اقدام تکمیلی کلاس های MenuItem هستند و باید در onCreate SettingsFragment یا BaseFragment مربوطه ایجاد شوند. ویژگی هایی مانند قابلیت مشاهده، حالت و غیره باید توسط تنظیم کننده ها در منطق تجاری 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); } }
نوارهای عمل با پشتیبانی از بهینه سازی حواس پرتی در تنظیمات خودرو ارائه می شوند. UXRestrictions را در MenuItem.Builder در هنگام ایجاد تنظیم کنید.
هر صفحه تنظیمات می تواند تعدادی تنظیمات برگزیده مختلف را در خود جای دهد.
برای چگونگی ارتباط این اجزاء به تصویر زیر نگاه کنید:
شکل 1. اجزای تنظیمات خودرو
PreferenceController یک جزء آگاه از چرخه حیات است که به کپسوله کردن منطق تجاری مربوط به Preferences خاص کمک می کند. PreferenceControllers فقط می توان از طریق XML به Preference مربوطه متصل کرد.
// 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 از طریق کد جلوگیری می کند تا اصلاح سلسله مراتب تنظیمات را با حداقل تغییرات در کد جاوا آسان تر کند.
این امکان وجود دارد که یک PreferenceController برای عملکرد صحیح به مقداری داده پویا نیاز داشته باشد. برای مثال، یک PreferenceController که اعلانهای یک برنامه را خاموش میکند، باید بداند روی کدام برنامه عمل کند. از آنجایی که PreferenceControllers همیشه در XML تعریف می شوند، راهی برای ارائه آرگومان های سازنده اضافی وجود ندارد. در عوض، این مقادیر اضافی از طریق تنظیم کننده های عمومی در PreferenceController ارائه می شوند و با استفاده از روش use(...) از SettingsFragment تنظیم می شوند.
// 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(...) استفاده شود، حفظ هدف اصلی یعنی امکان تنظیم مجدد سلسله مراتب تنظیمات با حداقل تغییرات در کد جاوا سخت تر می شود، زیرا بخش های بزرگی از کد قطعه موجود باید در قطعه جدید ایجاد شده کپی شود. یک راه برای به حداقل رساندن دشواری انجام این کار این است که:
- استفاده از
use(...). - سعی کنید هر فراخوانی برای
use(...)در یک مکان در قطعه نگه دارید (مثلاً در متدonAttach()).
تمام مقاصدی که باید توسط برنامه تنظیمات خودرو مدیریت شود در فایل مانیفست تعریف شده است. Intent ها به طور کلی مانند اکثر برنامه های استاندارد اندروید تعریف و مدیریت می شوند و تمام فعالیت ها و فیلترهای هدف در مانیفست تعریف شده اند.
در صورت تمایل، نماد خروج را می توان با استفاده از config_show_settings_root_exit_icon نمایش داده یا پنهان کرد.
برنامه تنظیمات خودرو در درجه اول از CarSettingTheme استفاده می کند که یک برنامه افزودنی Theme.CarUi است. این موضوع برای استاندارد کردن ظاهر و احساس برنامه های سیستم برای اطمینان از ثبات در سیستم استفاده می شود.
سفارشی کردن تنظیمات برگزیده شامل این مکانهای اضافی میشود:
- طرحبندی برخی از کلاسهای ترجیحی پایه در
car_preferenceتعریف شده و برای ساخت خودرو روی آن قرار گرفته است . هر طرحبندی سفارشیسازی برای کلاسهای ترجیحی پایه را میتوان در اینجا جایگزین کرد. - تنظیمات خودرو از برخی اولویتهای سفارشی استفاده میکند که عمدتاً در بسته
commonتعریف شدهاند. اینها باید در ماژول تنظیمات خودرو به طور جداگانه از کلاس های ترجیحی پایه همپوشانی شوند.