ארכיטקטורת מידע

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

דוגמאות ומקור

רוב הדפים בהגדרות מיושמים כעת באמצעות המסגרת החדשה. דוגמה טובה היא DisplaySettings: packages/apps/Settings/src/com/android/settings/DisplaySettings.java

נתיבים לקבצים עבור רכיבים חשובים מפורטים להלן:

  • CategoryKey : packages/SettingsLib/src/com/android/settingslib/drawer/CategoryKey.java
  • DashboardFragmentRegistry : packages/apps/Settings/src/com/android/settings/dashboard/DashboardFragmentRegistry.java
  • DashboardFragment : packages/apps/Settings/src/com/android/settings/dashboard/DashboardFragment.java
  • AbstractPreferenceController : frameworks/base/packages/SettingsLib/src/com/android/settingslib/core/AbstractPreferenceController.java
  • BasePreferenceController (הוצג באנדרואיד 9): packages/apps/Settings/src/com/android/settings/core/BasePreferenceController.java

יישום

יצרני התקנים מוזמנים להתאים את ארכיטקטורת המידע הקיימת בהגדרות ולהוסיף דפי הגדרות נוספים לפי הצורך כדי להתאים לתכונות ספציפיות לשותף. העברת העדפות מדף מדור קודם (מיושם בתור SettingsPreferencePage ) לדף חדש (מיושם באמצעות DashboardFragment ) יכולה להיות מסובכת. סביר להניח שההעדפה מהדף מדור קודם לא מיושמת עם PreferenceController .

אז כאשר מעבירים העדפות מדף מדור קודם לדף חדש, עליך ליצור PreferenceController ולהעביר את הקוד לבקר לפני הפעלתו ב- DashboardFragment החדש. ממשקי ה-API ש- PreferenceController דורש מתוארים בשמם ומתועדים ב-Javadoc.

מומלץ מאוד להוסיף מבחן יחידה לכל PreferenceController . אם השינוי מוגש ל-AOSP, יש צורך בבדיקת יחידה. כדי לקבל מידע נוסף על איך לכתוב בדיקות מבוססות Robolectric, עיין packages/apps/Settings/tests/robotests/README.md .

ארכיטקטורת מידע בסגנון תוסף

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

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

DashboardFragment

DashboardFragment הוא המארח של בקרי העדפות בסגנון תוסף. הפרגמנט יורש מ- PreferenceFragment ויש לו ווים להרחבה ולעדכון הן רשימות העדפות סטטיות והן רשימות העדפות דינמיות.

העדפות סטטיות

רשימת העדפות סטטית מוגדרת ב-XML באמצעות התג <Preference> . מימוש DashboardFragment משתמש בשיטת getPreferenceScreenResId() כדי להגדיר איזה קובץ XML מכיל את רשימת ההעדפות הסטטית להצגה.

העדפות דינמיות

פריט דינמי מייצג אריח עם כוונה, המוביל לפעילות חיצונית או פנימית. בדרך כלל, הכוונה מובילה לדף הגדרה אחר. לדוגמה, פריט ההגדרה "גוגל" בדף הבית של הגדרות הוא פריט דינמי. פריטים דינמיים מוגדרים ב- AndroidManifest (נדון בהמשך) ונטענים דרך FeatureProvider (מוגדר כ- DashboardFeatureProvider ).

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

  • ההגדרה אינה מיושמת ישירות באפליקציית ההגדרות (כגון הזרקת הגדרה המיושמת על ידי אפליקציות OEM/ספק).
  • ההגדרה אמורה להופיע בדף הבית של ההגדרות.
  • כבר יש לך Activity עבור ההגדרה ואתה לא רוצה ליישם את התצורה הסטטית הנוספת.

כדי להגדיר פעילות כהגדרה דינמית, בצע את הפעולות הבאות:

  • סמן את הפעילות כהגדרה דינמית על ידי הוספת מסנן כוונות לפעילות.
  • אמור לאפליקציית ההגדרות לאיזו קטגוריה היא שייכת. הקטגוריה היא קבועה, המוגדרת ב- CategoryKey .
  • אופציונלי: הוסף טקסט סיכום כאשר ההגדרה מוצגת.

הנה דוגמה שנלקחה מאפליקציית ההגדרות עבור DisplaySettings .

<activity android:name="Settings$DisplaySettingsActivity"
                   android:label="@string/display_settings"
                   android:icon="@drawable/ic_settings_display">
             <!-- Mark the activity as a dynamic setting -->
              <intent-filter>
                     <action android:name="com.android.settings.action.IA_SETTINGS" />
              </intent-filter>
             <!-- Tell Settings app which category it belongs to -->
              <meta-data android:name="com.android.settings.category"
                     android:value="com.android.settings.category.ia.homepage" />
             <!-- Add a summary text when the setting is displayed -->
              <meta-data android:name="com.android.settings.summary"
                     android:resource="@string/display_dashboard_summary"/>
             </activity>

בזמן רינדור, הפרגמנט יבקש רשימה של העדפות הן מהגדרות XML סטטיות והן מהגדרות דינמיות המוגדרות ב- AndroidManifest . בין אם ה- PreferenceController מוגדרים בקוד Java או ב-XML, DashboardFragment מנהל את לוגיקה הטיפול של כל הגדרה באמצעות PreferenceController (נדון להלן). לאחר מכן הם מוצגים בממשק המשתמש כרשימה מעורבת.

Preference Controller

ישנם הבדלים בין הטמעת PreferenceController ב-Android 9 ו-Android 8.x, כמתואר בסעיף זה.

PreferenceController במהדורת אנדרואיד 9

PreferenceController מכיל את כל ההיגיון לאינטראקציה עם ההעדפה, כולל הצגה, עדכון, הוספת חיפוש לאינדקס וכו'.

הממשק של PreferenceController מוגדר כ- BasePreferenceController . לדוגמה, ראה קוד packages/apps/Settings/src/com/android/settings/core/ BasePreferenceController.java

ישנן מספר תת-מחלקות של BasePreferenceController , כל אחת ממפה לסגנון ממשק משתמש ספציפי בו תומכת אפליקציית ההגדרות כברירת מחדל. לדוגמה, TogglePreferenceController יש ממשק API שממפה ישירות לאופן שבו המשתמש צריך לקיים אינטראקציה עם ממשק משתמש העדפה מבוסס החלפת מצב.

BasePreferenceController יש ממשקי API כמו getAvailabilityStatus() , displayPreference() , handlePreferenceTreeClicked(), וכו'. תיעוד מפורט עבור כל API נמצא במחלקת הממשק.

הגבלה על הטמעת BasePreferenceController (ותת המחלקות שלו כגון TogglePreferenceController ) היא שחתימת הבנאי חייבת להתאים לכל אחת מהאפשרויות הבאות:

  • public MyController(Context context, String key) {}
  • public MyController(Context context) {}

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

DashboardFragment שומר רשימה של PreferenceController במסך. ב- onCreate() של הפרגמנט, כל הבקרים מופעלים עבור השיטה getAvailabilityStatus() ואם היא מחזירה true, displayPreference() מופעל לעיבוד לוגיקה של תצוגה. getAvailabilityStatus() חשוב גם כדי לומר למסגרת ההגדרות אילו פריטים זמינים במהלך החיפוש.

PreferenceController במהדורות אנדרואיד 8.x

PreferenceController מכיל את כל ההיגיון לאינטראקציה עם ההעדפה, כולל הצגה, עדכון, אינדקס חיפוש. וכו '

בהתאם לאינטראקציות ההעדפה, לממשק של PreferenceController יש APIs isAvailable() , displayPreference() , handlePreferenceTreeClicked() וכו'. תיעוד מפורט על כל API ניתן למצוא במחלקת הממשק.

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

DashboardFragment שומר רשימה של PreferenceControllers במסך. ב- onCreate() של הפרגמנט, כל הבקרים מופעלים עבור שיטת isAvailable() , ואם היא מחזירה true, displayPreference() מופעל לעיבוד לוגיקה של תצוגה.

שימוש ב-DashboardFragment

העברת העדפה מעמוד א' לב'

אם ההעדפה רשומה סטטית בקובץ ה-XML של העדפות הדף המקורי, בצע את הליך ההעברה הסטטי עבור מהדורת Android שלך למטה. אחרת, עקוב אחר הליך ההעברה הדינמית עבור גרסת האנדרואיד שלך.

מהלך סטטי באנדרואיד 9

  1. מצא את קובצי ה-XML המועדפים עבור הדף המקורי ודף היעד. אתה יכול למצוא מידע זה בשיטת getPreferenceScreenResId() של הדף.
  2. הסר את ההעדפה מה-XML של הדף המקורי.
  3. הוסף את ההעדפה ל-XML של דף היעד.
  4. הסר את PreferenceController עבור העדפה זו מהטמעת Java של הדף המקורי. בדרך כלל זה נמצא ב- createPreferenceControllers() . ייתכן שהבקר יוכרז ישירות ב-XML.

    הערה : ייתכן שלהעדפה אין PreferenceController .

  5. הפעל את PreferenceController ב- createPreferenceControllers() של דף היעד. אם PreferenceController מוגדר ב-XML בעמוד הישן, הגדר אותו גם ב-XML עבור הדף החדש.

מהלך דינמי באנדרואיד 9

  1. מצא איזו קטגוריה מארח דף המקורי והיעד. אתה יכול למצוא מידע זה ב- DashboardFragmentRegistry .
  2. פתח את הקובץ AndroidManifest.xml המכיל את ההגדרה שאתה צריך להעביר ומצא את הערך Activity המייצג הגדרה זו.
  3. הגדר את ערך המטא נתונים של הפעילות עבור com.android.settings.category למפתח הקטגוריה של הדף החדש.

מהלך סטטי במהדורות אנדרואיד 8.x

  1. מצא את קובצי ה-XML המועדפים עבור הדף המקורי ודף היעד.
  2. אתה יכול למצוא מידע זה בשיטת getPreferenceScreenResId() של הדף.
  3. הסר את ההעדפה ב-XML של הדף המקורי.
  4. הוסף את ההעדפה ל-XML של דף היעד.
  5. הסר את PreferenceController עבור העדפה זו ביישום Java של הדף המקורי. בדרך כלל זה ב- getPreferenceControllers() .
  6. הערה : ייתכן שלהעדפה אין PreferenceController .

  7. הפעל את PreferenceController ב- getPreferenceControllers() של דף היעד.

מהלך דינמי במהדורות אנדרואיד 8.x

  1. מצא איזו קטגוריה מארח דף המקורי והיעד. אתה יכול למצוא מידע זה ב- DashboardFragmentRegistry .
  2. פתח את הקובץ AndroidManifest.xml המכיל את ההגדרה שאתה צריך להעביר ומצא את הערך Activity המייצג הגדרה זו.
  3. שנה את ערך המטא נתונים של הפעילות עבור com.android.settings.category , הגדר את נקודת הערך למפתח הקטגוריה של הדף החדש.

יצירת העדפה חדשה בדף

אם ההעדפה רשומה סטטית בקובץ ה-XML של העדפות הדף המקורי, בצע את ההליך הסטטי שלהלן. אחרת בצע את ההליך הדינמי .

יצירת העדפה סטטית

  1. מצא את קובצי ה-XML המועדפים עבור הדף. אתה יכול למצוא מידע זה בשיטת getPreferenceScreenResId() של הדף.
  2. הוסף פריט העדפה חדש ב-XML. ודא שיש לו android:key ייחודי.
  3. הגדר PreferenceController עבור העדפה זו בשיטת getPreferenceControllers() של הדף.
    • ב-Android 8.x ואופציונלי ב-Android 9, הצג PreferenceController עבור העדפה זו בשיטת createPreferenceControllers() של הדף.

      אם ההעדפה הזו כבר הייתה קיימת במקומות אחרים, ייתכן שכבר קיים PreferenceController עבורה. אתה יכול לעשות שימוש חוזר ב- PreferenceController מבלי לבנות אחד חדש.

    • החל באנדרואיד 9, אתה יכול לבחור להכריז על PreferenceController ב-XML לצד ההעדפה. לדוגמה:
      <Preference
              android:key="reset_dashboard"
              android:title="@string/reset_dashboard_title"
              settings:controller="com.android.settings.system.ResetPreferenceController"/>
      

יצירת העדפה דינמית

  1. מצא איזו קטגוריה מארח דף המקורי והיעד. אתה יכול למצוא מידע זה ב- DashboardFragmentRegistry .
  2. צור פעילות חדשה ב- AndroidManifest
  3. הוסף מטא נתונים נחוצים לפעילות החדשה כדי להגדיר את ההגדרה. הגדר את ערך המטא נתונים עבור com.android.settings.category לאותו ערך שהוגדר בשלב 1.

צור דף חדש

  1. צור קטע חדש שיורש מ- DashboardFragment .
  2. הגדר את הקטגוריה שלו ב- DashboardFragmentRegistry .

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

  3. בצע את השלבים להוספת ההגדרות הדרושות עבור דף זה. למידע נוסף, עיין בסעיף יישום .

מַתַן תוֹקֵף

  • הפעל את הבדיקות הרובולקטריות בהגדרות. כל המבחנים הקיימים והחדשים צריכים לעבור.
  • בנה והתקן הגדרות ולאחר מכן פתח ידנית את הדף המשתנה. הדף אמור להתעדכן באופן מיידי.