התאמה אישית של שתי חלוניות

ב-Android 12 יש עיצוב של שתי חלוניות, עם תפריט L0 סטטי בצד ימין וחלונית תוכן בצד שמאל. התכונה הזו כוללת אפשרויות התאמה אישית רבות. בדף הזה מפורטות התכונות האלה ומוסבר איך להתאים אישית את ההעדפות שלכם.

חזרה לחלונית אחת

כברירת מחדל, תצוגת שתי החלוניות מוצגת באפליקציית CarSettings כשרוחב החלון של האפליקציה גדול מ-1,400dp או שווה לו, ובמקרים אחרים מוצגת תצוגת חלונית אחת. כדי להתאים אישית את ההגדרה הזו למכשיר ספציפי, משתמשים בשכבת-על של משאבים בסביבת זמן ריצה (RRO) כדי לטרגט את ערכי ההגדרה הנדרשים:

ערך תיאור
config_global_force_single_pane מגדירים את הערך true אם כל האפליקציה תפעל בתצורה של חלון יחיד.
config_homepage_fragment_class מציין את קטע הקוד שממנו מתחיל דף הבית. בחלונית כפולה, הוא משמש לקטע הראשוני בחלונית התוכן. בחלונית אחת, זה צריך להיות קטע דף הבית.

מפתחות כותרות

מאחר שלפעילויות שונות של CarSettings יכולה להיות IA בהתאמה אישית, מוצג מיפוי של מפתחות כותרות כדי לפשט את ההתאמות האישיות. ב-AndroidManifest.xml, לכל פעילות שתומכת בשני חלונות יש TOP_LEVEL_HEADER_KEY שמוגדר במטא-נתונים שלה. הערך הזה מפנה למפתח שצוין ב-res/values/header_keys.xml, שממופה למפתח ההעדפה של פריט התפריט ברמה העליונה שאליו שייך הפרגמנט ההתחלתי. לכן, אם משנה את קטע ההתחלה של פעילות או מסדרים מחדש את ה-IA כך שקטע מסוים ייכלל בהעדפה אחרת ברמה העליונה, אפשר לעדכן את המיפויים הרלוונטיים בקובץ header_keys.xml כדי לציין את הערך הנכון.

התאמה אישית של פריסת הפעילות

הפריסה של BaseCarSettingsActivity נמצאת בקובץ res/layout/car_setting_activity ובקטעים הבאים:

ערך תיאור
top_level_menu קטע תפריט ברמה העליונה שמוצג בהגדרות עם שתי חלוניות. רוחב הקטע הזה מצוין על ידי top_level_menu_width. התצוגה הזו מוקפת בפריסת בסיס של שלדה (עם סרגל כלים).
top_level_divider קו אנכי שמחלק את שני החלונות, וניתן להתאים אישית את הרוחב שלו באמצעות top_level_divider_width.
fragment_container_wrapper פריסת עטיפה לחלונית התוכן (או לחלונית הראשית בהגדרה של חלונית אחת). התצוגה הזו מוקפת בתבנית בסיסית של שלדה (עם סרגל כלים).
settings_focus_parking_view הטמעה מותאמת אישית של FocusParkingView כדי לשמור על המיקוד בתנועה סיבובית במקרה הצורך.
fragment_container מאגר התוכן הראשי. קטעי התוכן משתמשים בפריסה הזו בתור פריסת היעד.
restricted_message תצוגת חסימה מוגבלת לממשק המשתמש שמוצגת במכונות של BaseFragment.

איור 1. פריסה של שתי חלוניות

העדפות ברמה העליונה

העדפות ברמה העליונה הן CarUiPreferences בהתאמה אישית עם פריסה ששונתה מעט כדי לשנות את גובה ההעדפה ואת צורת הרקע. יש הרבה דרכים להתאים אישית את המראה של ההעדפות האלה:

ערך תיאור
res/layout/top_level_preference.xml שכבת-על של כל הפריסה של ההעדפות.
top_level_preference_min_height הגובה המינימלי של ההעדפה ברמה העליונה. בהתאם לתוכן (לדוגמה, אם יש כתוביות), ההעדפות עשויות להיות גבוהות מהערך הזה.
top_level_preference_corner_radius רדיוס העיגול של הפינה.
top_level_preference_background הרקע של ההעדפות ברמה העליונה כשהן לא מודגשות.
top_level_preference_highlight הרקע של ההעדפות ברמה העליונה כשהן מודגשות.

סמלים ברמה העליונה

באיור 2 אפשר לראות איך הסמלים ברמה העליונה מורכבים עכשיו מסמל וקטורי בתוך צורה של רקע צבעוני. כרגע, הצורה הזו מוגדרת לתמיכה בצורה אליפסית או בצורה מלבנית. כברירת מחדל, הצורה מוגדרת כאליפסה.

כדי לשנות את ברירת המחדל, משנים את הערך ב-config_top_level_icon_shape (כאשר 0 הוא מלבן ו-1 הוא אליפסה). כדי ליצור את הסמלים, מעבירים את הסמל של חזית התמונה top_level_foreground_icon_inset לתוך צורת הרקע. לכל סמל ברמה העליונה יש צבע חזית שצוין בקובץ res/values/colors.xml וצבע רקע שצוין בתיקייה res/color.

כדי ליצור מראה מותאם אישית, אפשר לשנות את כל ערכי הצבעים.

איור 2. רכיבי ההעדפות ברמה העליונה

סמלים של העדפות שהוזנו שנכללים בקטגוריות שצוינו על ידי config_top_level_injection_categories נחשבים גם הם כסמלים ברמה העליונה. הסמלים שסיפקתם יוצגו באותו ערך ובאותו צורה שצוינו לכל שאר הסמלים ברמה העליונה (ראו למעלה). עם זאת, הרקע נקבע על סמך המאפיינים הבאים לפי הסדר הבא:

  1. com.android.settings.bg.argb מטא-נתונים מהאפליקציה שמבצעת את ההזרקה.
  2. com.android.settings.bg.hint מטא-נתונים מהאפליקציה שמבצעת את ההזרקה.
  3. top_level_injected_default_background מצוין ב-res/values/colors.xml.

כדי להתעלם מהחדרת נתוני האפליקציה ולהשתמש תמיד ברקע ברירת המחדל, מגדירים את config_top_level_injection_background_always_use_default לערך true.