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

ב-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.