סקירה כללית של משאבי האפליקציה

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

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

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

סוגי המשאבים של הקבוצה

מציבים כל סוג משאב בספריית משנה ספציפית של הפרויקט ספריית res/. לדוגמה, כך היררכיית הקבצים בפרויקט פשוט:

MyProject/
    src/
        MyActivity.java
    res/
        drawable/
            graphic.png
        layout/
            main.xml
            info.xml
        mipmap/
            icon.png
        values/
            strings.xml

הספרייה res/ מכילה את כל המשאבים ספריות משנה: משאב תמונה, שני משאבי פריסה, ספריית mipmap/ למרכז האפליקציות וקובץ משאב מסוג מחרוזת. מקור המידע שמות הספריות חשובים והם מתוארים בטבלה 1.

הערה: מידע נוסף על השימוש בתיקיות ה-mipmap זמין במאמר להציב סמלי אפליקציות בספריות של מיפוי במפה.

טבלה 1. ספריות משאבים נתמך בספריית הפרויקט res/.

ספרייה סוג משאב
animator/ קובצי XML שמגדירים נכס אנימציות.
anim/ קובצי XML שמגדירים מצב טרום-עשרה אנימציות. אפשר לשמור בספרייה הזו גם אנימציות של נכסים, אבל עדיפה הספרייה animator/ לאנימציות של מאפיינים כדי להבחין בין שני המאפיינים שונים.
color/ קובצי XML שמגדירים רשימת מצב של צבעים. אפשר לקרוא מידע נוסף במאמר בנושא צבע רשימת המצבים האפשריים.
drawable/

קובצי Bitmap, .9.png, JPG או GIF) או קובצי XML עוברים הידור לפי סוגי המשנה הבאים של משאבים שניתנים להזזה:

  • קובצי Bitmap
  • תשעה תיקונים (מפות סיביות שניתן לשנות את הגודל שלהן)
  • רשימות של מדינות
  • צורות
  • פריטי אנימציה להזזה
  • פריטים שניתנים להזזה אחרים

אפשר לקרוא מידע נוסף בקטע משאבים ניתנים לשרטוט.

mipmap/ קבצים ניתנים לציור לדחיסות שונות של סמל מרכז האפליקציות. מידע נוסף על ניהול סמלי מרכז האפליקציות עם mipmap/ תיקיות. אפשר לראות הוספת סמלי אפליקציות ספריות Mipmap.
layout/ קובצי XML שמגדירים את הפריסה של ממשק המשתמש. אפשר לקרוא מידע נוסף במשאב הפריסה.
menu/ קובצי XML שמגדירים תפריטי אפליקציות, כמו תפריט אפשרויות, תפריט הקשר או תפריט משנה. תוכלו לקרוא מידע נוסף בקטע משאב תפריט.
raw/

קבצים שרירותיים לשמירה בצורתם הגולמית. כדי לפתוח את המשאבים האלה באמצעות קובץ RAW InputStream, שיחה Resources.openRawResource() במזהה המשאב שהוא R.raw.filename.

עם זאת, אם אתם צריכים גישה לשמות הקבצים המקוריים ולהיררכיית הקבצים, כדאי לבדוק שמירת משאבים בספרייה assets/ במקום בספרייה res/raw/. לקבצים שנמצאים בתיקייה assets/ אין מזהה משאב, כך שאפשר לקרוא אותו רק באמצעות AssetManager.

values/

קובצי XML שמכילים ערכים פשוטים, כמו מחרוזות, מספרים שלמים וצבעים.

קובצי משאבי XML בספריות משנה אחרות ב-res/ מגדירים משאב יחיד בהתאם לשם קובץ ה-XML, הקבצים בספרייה values/ מתארים משאבים מרובים. לקובץ בספרייה הזו, כל צאצא של הרכיב <resources> מגדיר משאב. לדוגמה, רכיב <string> יוצר המשאב R.string, ורכיב <color> יוצרים R.color משאב.

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

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

xml/ קובצי XML שרירותיים שאפשר לקרוא אותם בזמן ריצה באמצעות קריאה ל-Resources.getXML(). קובצי תצורת XML שונים צריך לשמור אותו כאן, למשל הגדרות חיפוש.
font/ קובצי גופנים עם סיומות כמו TTF, OTF או קובצי XML, כוללים רכיב <font-family>. מידע נוסף על גופנים בתור משאבים, הוספת גופן כמשאב XML.

זהירות: אף פעם אל תשמרו קובצי משאבים ישירות בתוך ספריית res/. הוא גורם לשגיאת מהדר.

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

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

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

מתן מקורות מידע חלופיים

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

איור 1. שני מכשירים שמשתמשים במשאבי פריסה שונים בהתאם לגודל המסך.

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

  1. יצירת ספרייה חדשה ב-res/ ששמה מופיע בטופס <resources_name>-<qualifier>.
    • <resources_name> הוא שם הספרייה של ברירת המחדל המתאימה משאבים (מוגדרים בטבלה 1).
    • <qualifier> הוא שם שמציין הגדרה אישית מסוימת שעבורם רוצים להשתמש במשאבים האלה (מוגדר בטבלה 2).

    אפשר לצרף יותר ממחרוזת <qualifier> אחת. הפרדה אחד עם מקף.

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

  2. שומרים את המשאבים החלופיים המתאימים בספרייה החדשה. קובצי המשאבים חייבים להיות שהשם יהיה זהה לגמרי לקובצי ברירת המחדל של המשאבים.

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

res/
    drawable/
        icon.png
        background.png
    drawable-hdpi/
        icon.png
        background.png

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

זהירות: כשמגדירים משאב חלופי, צריך להקפיד להגדיר גם את המשאב בהגדרות ברירת המחדל. אחרת, האפליקציה עשויה להיתקל בזמן ריצה חריגים כשהמכשיר משנה הגדרה אישית. לדוגמה, אם תוסיפו מחרוזת רק values-en ולא values, האפליקציה עלולה להיתקל ב חריג Resource Not Found כאשר המשתמש משנה את שפת ברירת המחדל של המערכת.

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

טבלה 2. תוחם ההגדרות האישיות שמות.

הגדרות אישיות ערכי מגדיר תיאור
חשבון ניהול (MCC) ו-MNC דוגמאות:
mcc310
mcc310-mnc004
mcc208-mnc00

קוד המדינה לנייד (MCC), אופציונלי ואחריו הקוד של הרשת הסלולרית (MNC) מכרטיס ה-SIM שבמכשיר. לדוגמה, הכתובת mcc310 נמצאת בארה"ב אצל כל ספק, mcc310-mnc004 נמצא בארה"ב ב-Verizon, ו-mcc208-mnc00 נמצא בארה"ב ב-Verizon כתום.

אם המכשיר משתמש בחיבור רדיו (כלומר, זהו טלפון GSM), ערכי MCC ו-MNC מגיעים מכרטיס ה-SIM.

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

צריך לעיין גם בשדות ההגדרה mcc ו-mnc, שמציינים את קוד המדינה הנוכחית של הנייד והקוד של הרשת הסלולרית, בהתאמה.

שפה, סקריפט (אופציונלי) ואזור (אופציונלי) דוגמאות:
en
fr
en-rUS
fr-rFR
fr-rCA
b+en
b+en+US
b+es+419
b+zh+Hant
b+sr+Latn+RS

השפה מוגדרת באמצעות קוד שפה בן שתי אותיות לפי תקן ISO 639-1, ואחריו יש אפשרות לשים לב באמצעות קוד אזור בן שתי אותיות לפי תקן ISO 3166-1-alpha-2 (הקודם r).

הקודים לא תלויי אותיות רישיות (case-sensitive). הקידומת r משמש להבחנה בין החלק של האזור. אי אפשר לציין אזור בלבד.

ב-Android 7.0 (רמת API 24) נוספה תמיכה ב- BCP 47 של השפות, שבהם אפשר להשתמש משאבים ספציפיים לאזור. תג שפה מורכב מרצף של תג משנה אחד או יותר, שכל אחד מהם מצמצם או מצמצם את הטווח השפה המזוהה על ידי התג הכולל. מידע נוסף על את תגי השפה, ראו תגים לזיהוי שפות.

כדי להשתמש בתג שפה BCP 47, צריך לשרשר את b+ קוד שפה בן שתי אותיות לפי ISO 639-1, עם אפשרות ואחריו באמצעות תגי משנה נוספים שמופרדים באמצעות +.

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

מדריך מלא להתאמת האפליקציה לשפות אחרות זמין במאמר התאמה של האפליקציה לשוק המקומי.

כדאי לעיין גם בשיטה getLocales(), שמספקת את הרשימה המוגדרת של ולוקאלים. הרשימה הזו כוללת את הלוקאל הראשי.

כיוון הפריסה ldrtl
ldltr

כיוון הפריסה של האפליקציה. המשמעות של ldrtl היא "layout-direction-right-to-left". ldltr פירושו "layout-direction-left-to-right" והוא הערך המשתמע שמוגדר כברירת מחדל.

האפשרות הזו יכולה לחול על כל משאב, כמו תבניות, פריטים גרפיים או ערכים.

לדוגמה, אם רוצים לספק פריסה ספציפית עבור השפה הערבית פריסה כללית אחרת מימין לשמאל כמו פרסית בעברית, משתמשים בספריות כמו:

res/
  layout/
    main.xml (פריסת ברירת המחדל)
  layout-ar/
    main.xml (פריסה ספציפית עבור ערבית)

  layout-ldrtl/     main.xml (כל כיוון מימין לשמאל למעט ערבית, כי ה-'ar' בהגדרת שפה יש קדימות גבוהה יותר)

הערה: כדי להפעיל תכונות של פריסה מימין לשמאל באפליקציה, צריך להגדיר את SupportsRtl ל-"true" ולהגדיר את TargetSdkVersion ל-17 ואילך.

נוסף ברמת API 17.

הרוחב הקטן ביותר sw<N>dp

דוגמאות:
sw320dp

sw600dp sw720dp
וכו'

המאפיין הקצר ביותר של אזור המסך שזמין לאפליקציה. באופן ספציפי, השדה smallestWidth של חלון האפליקציה הוא הקצר ביותר מהגובה והרוחב הזמינים של החלון. אפשר גם לחשוב על זה בתור "הרוחב הקטן ביותר האפשרי" לחלון. אפשר להשתמש במאפיין הזה כך שלאפליקציה יש רוחב זמין של <N> dps לפחות עבור ממשק המשתמש שלו.

לדוגמה, אם הפריסה דורשת את המידות הקטנה ביותר של המסך להיות לפחות 600 dp כל הזמן, תוכל להשתמש בערך הזה כדי ליצור את משאבי הפריסה בספרייה res/layout-sw600dp/. המערכת משתמשת במשאבים האלה רק כאשר המאפיין הקטן ביותר של המסך הזמין הוא לפחות 600dp, גם אם הצד של 600dp גובה או רוחב. אם משנים את גודל החלון, הרוחב הקטן ביותר יכול להשתנות. שינוי הרוחב/גובה הזמין או במיקום החדש, שעשויים לשנות את inset של המערכת.

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

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

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

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

  • 320, במכשירים עם הגדרות מסך כמו:
    • 240x320 ldpi (טלפון QVGA)
    • 320x480 mdpi (טלפון)
    • 480x800 hdpi (טלפון בצפיפות גבוהה)
  • 480, למסכים כמו 480x800 mdpi (טאבלט/טלפון)
  • 600, למסכים כמו 600x1024 mdpi (טאבלט 7 אינץ')
  • 720, למסכים כמו 720x1280 mdpi (טאבלט 10 אינץ')

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

נוסף ברמת API 13.

מומלץ לעיין גם בandroid:requiresSmallestWidthDp שמצהיר על הערך המינימלי smallestWidth שבאמצעותו שהאפליקציה תואמת, smallestScreenWidthDp שדה תצורה, שמכיל את הערך smallestWidth של המכשיר.

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

רוחב וגובה זמינים w<N>dp
h<N>dp

דוגמאות:

w720dp w1024dp

h720dp h1024dp
וכו'

ציון הרוחב או הגובה המינימלי של המסך (ב-dp יחידות שהוגדרו) לפי הערך <N>) שבו נעשה שימוש במשאב. האלה ערכי ההגדרות האישיות מושווים לרוחב ולגובה התצוגה הנוכחיים של המכשיר משתנה כיוון לאורך לרוחב, לאורך, כשהמכשיר מתקפל או מתקפל, או נכנס למצב ריבוי חלונות או יוצא ממנו. במצב ריבוי חלונות, הערכים משקפים את הרוחב והגובה של החלון שמכיל את האפליקציה, לא הרוחב והגובה של החלון מסך המכשיר. באופן דומה, עבור פעילויות מוטמעות, הערכים קשורים לרוחב גובה הפעילויות הנפרדות, לא הרוחב והגובה של המסך. לקבלת מידע נוסף, למידע נוסף, אפשר לקרוא את המאמר הטמעת פעילות.

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

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

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

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

הערה: המערכת בוחרת את המשאב שתואם לשני הסוגים ב- רוחב וגובה. לכן עדיף להשתמש במשאב שמציין את שניהם שמציין רק אחד מהשניים. לדוגמה, אם המסך בפועל הוא ברוחב של 720dp משאב גבוה של 1280dp ומשאב אחד כשיר ל-w720dp ומשאב אחר כשיר w700dp-h1200dp, האפשרות השנייה נבחרה על אף שהראשון הוא התאמה מדויקת הוא מציין.

נוסף ברמת API 13.

ראו גם את screenWidthDp ו-screenHeightDp הגדרות אישיות, ששומרות את הרוחב והגובה של המסך הנוכחי.

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

גודל המסך small
normal
large
xlarge
  • small: מסכים בגודל דומה למסכים מסך QVGA בצפיפות נמוכה. גודל הפריסה המינימלי למסך קטן הוא כ-320x426 יחידות dp. לדוגמה, QVGA צפיפות נמוכה וצפיפות VGA גבוהה.
  • normal: מסכים בגודל דומה למסכים של מסך HVGA בצפיפות בינונית. גודל הפריסה המינימלי למסך רגיל הוא בגודל של כ-320x470dp יחידות. דוגמאות למסכים כאלה צפיפות נמוכה, צפיפות בינונית של HVGA וצפיפות WVGA גבוהה.
  • large: מסכים שהגודל שלהם דומה לזה של מסך VGA עם צפיפות בינונית. גודל הפריסה המינימלי לפורמט גדול הוא בגודל של כ-480x640dp יחידות. דוגמאות: VGA ו-WVGA צפיפות בינונית מסכים.
  • xlarge: מסכים שגדולים במידה משמעותית מסך HVGA מסורתי בצפיפות בינונית. גודל הפריסה המינימלי למסך מוגדל הוא כ-720x960dp יחידות. ברוב המקרים, במכשירים עם מסכים גדולים במיוחד המכשיר גדול מדי לנשיאה בכיס, וסביר להניח מדובר במכשירים בסגנון טאבלט. נוסף ב- רמת API 9.

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

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

נוסף ברמת API 4.

ראו גם את screenLayout תצורה, שמציין אם המסך קטן, רגיל או גדול.

אפשר לקרוא מידע נוסף בקטע מסך סקירה כללית על התאימות.

היבט המסך long
notlong
  • long: מסכים ארוכים כמו WQVGA, WVGA, FWVGA
  • notlong: לא מסכים ארוכים, כמו QVGA , HVGA ו-VGA

נוסף ברמת API 4.

מבוסס רק על יחס הגובה-רוחב של המסך (מסך long רחב יותר). הזה לא קשורה לכיוון המסך.

צריך לעיין גם בשדה ההגדרה של screenLayout, שמציין אם המסך ארוך.

מסך עגול round
notround
  • round: מסכים עגולים, כמו מכשיר לביש עגול
  • notround: מסכים מלבניים, כמו טלפונים או טאבלטים

נוסף ברמת API 23.

הצגת ההגדרות האישיות של isScreenRound() method, שמציינת אם המסך עגול.

סולם צבעים רחב widecg
nowidecg
  • widecg: מסכים עם סולם צבעים רחב, כמו Display P3 או AdobeRGB
  • nowidecg: מסכים עם סולם צבעים צר, כמו sRGB

נוסף ברמת API 26.

הצגת ההגדרות האישיות של isScreenWideColorGamut() method, שמציינת אם למסך יש סולם צבעים רחב.

טווח דינמי גבוה (HDR) highdr
lowdr
  • highdr: מסכים עם טווח דינמי גבוה
  • lowdr: מסכים עם טווח דינמי נמוך/סטנדרטי

נוסף ברמת API 26.

הצגת ההגדרות האישיות של isScreenHdr() שיטה שמציינת אם למסך יש יכולות HDR.

כיוון המסך port
land
  • port: המכשיר בפריסה לאורך (אנכי)
  • land: המכשיר בפריסה לרוחב (אופקי)

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

צריך לעיין גם בשדה ההגדרה של orientation, שמציין את הכיוון הנוכחי של המכשיר.

מצב ממשק משתמש car
desk
television
appliance
watch
vrheadset
  • car: המכשיר מוצג באביזר עגינה לרכב
  • desk: המכשיר מוצג באביזר עגינה לשולחן העבודה
  • television: המכשיר מוצג בטלוויזיה ומספק "10 רגל" כשממשק המשתמש שלו נמצא על מסך גדול המשתמש רחוק, וחוויית השימוש היא בעיקר בלחצני החיצים (D-pad) או אינטראקציה ללא מצביע
  • appliance: המכשיר פועל כמכשיר חשמלי, עם אין תצוגה
  • watch: למכשיר יש מסך והוא עונד על פרק כף היד
  • vrheadset: המכשיר מוצג במציאות מדומה אוזניות

נוסף ברמת API 8; הוספת טלוויזיה ב-API 13; השעון נוסף ב-API 20.

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

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

מצב לילה night
notnight
  • night: שעות הלילה
  • notnight: שעות היום

נוסף ברמת API 8.

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

דחיסות פיקסלים במסך (dpi) ldpi
mdpi
hdpi
xhdpi
xxhdpi
xxxhdpi
nodpi
tvdpi
anydpi
nnndpi
  • ldpi: מסכים עם צפיפות נמוכה; בערך 120 dpi.
  • mdpi: מסכים בצפיפות בינונית (במסכים מסורתיים עם HVGA). בערך 160 dpi
  • hdpi: מסכים עם צפיפות גבוהה; בערך 240dpi.
  • xhdpi: מסכים עם צפיפות גבוהה במיוחד; בערך 320 dpi. נוסף ב-API רמה 8.
  • xxhdpi: מסכים בצפיפות גבוהה במיוחד; בערך 480 dpi. נוסף ב-API רמה 16.
  • xxxhdpi: שימושים בצפיפות גבוהה במיוחד (בסמל מרכז האפליקציות בלבד — ניתן לראות תמיכה בדחיסות פיקסלים שונה); בערך 640 dpi נוסף ברמת API 18.
  • nodpi: משמש למשאבים של מפת סיביות (bitmap) שאינך רוצה להתאים לעומס כדי להתאים לצפיפות המכשיר.
  • tvdpi: מסכים במיקום בין mdpi ל-hdpi. בערך 213 dpi. זה לא נחשב לדף 'ראשי' קבוצת צפיפות. הוא מיועד בעיקר לטלוויזיות ברזולוציה של 720p רוב האפליקציות לא זקוקים לו. בלוחות טלוויזיה באיכות 1080p צריך להשתמש במדיניות xhdpi. בלוחות טלוויזיה באיכות 4K יש להשתמש ב- xxxhdpi. נוסף ברמת API 13.
  • anydpi: תואם לכל הדחיסות של המסך ומקבל עדיפות על פני מגדירים אחרים. האפשרות הזאת שימושית במקרים פריטי גרפיקה וקטוריים נוספה ברמת API 21.
  • nnndpi: משמש לייצוג צפיפות לא סטנדרטיות, כאשר הערך nnn הוא צפיפות מסך של מספר שלם חיובי. הזה לא בשימוש ברוב המקרים. שימוש בקטגוריות בדחיסות רגילה מפחית משמעותית התקורה של התמיכה בדחיסות המסך השונות במכשירים בשוק.

יש יחס התאמה לעומס (scaling) של 3:4:6:8:12:16 בין שש צפיפות הצפיפות הראשית (התעלמות מה צפיפות tvdpi). כך, מפת סיביות של 9x9 ב-ldpi היא 12x12 ב-mdpi, 18x18 ב-hdpi, 24x24 ב-xhdpi, וכן הלאה.

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

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

סוג מסך המגע notouch
finger
  • notouch: למכשיר אין מסך מגע.
  • finger: המכשיר כולל מסך מגע שמיועד להיות בשימוש על ידי כיוון האינטראקציה של האצבע של המשתמש.

צריך לעיין גם בשדה ההגדרה של touchscreen, שמציין את הסוג של מסך המגע במכשיר.

זמינות המקלדת keysexposed
keyshidden
keyssoft
  • keysexposed: במכשיר יש מקלדת זמינה. אם במכשיר יש מקלדת תוכנה מופעלת (סביר להניח), היא משמשת גם כאשר מקלדת החומרה לא חשופה למשתמש או כשאין במכשיר מקלדת חומרה. אם אין תוכנה זמינה או מושבתת, אז נעשה בה שימוש רק כאשר מקלדת חומרה היא נחשפת.
  • keyshidden: למכשיר יש מקלדת חומרה זמינה, אבל מוסתר וגם לא מופעלת במכשיר מקלדת תוכנה.
  • keyssoft: במכשיר מופעלת מקלדת תוכנה, בין אם גלוי או לא גלוי.

אם סיפקת keysexposed משאבים אבל לא keyssoft המשאבים, המערכת משתמשת במשאבי keysexposed, גם אם המקלדת גלויה כל עוד המערכת מפעילה מקלדת תוכנה.

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

יש לעיין גם בשדות ההגדרה hardKeyboardHidden ו-keyboardHidden, המציינים את רמת החשיפה של חומרה והחשיפה של כל סוג של מקלדת (כולל תוכנה), בהתאמה.

שיטת קלט טקסט ראשית nokeys
qwerty
12key
  • nokeys: אין למכשיר מקשי חומרה לקלט טקסט.
  • qwerty: למכשיר יש מקלדת QWERTY חומרה, בין שהיא גלויה משתמש או לא.
  • 12key: למכשיר יש מקלדת חומרה עם 12 מקשים, לא משנה אם היא גלויה למשתמש או לא.

צריך לעיין גם בשדה ההגדרה של keyboard, שמציין את השיטה הראשית של קלט הטקסט.

גרסת פלטפורמה (רמת API) דוגמאות:
v3
v4
v7
וכו'

רמת ה-API שבה המכשיר תומך. לדוגמה, v1 לרמת ה-API 1 (מכשירים עם Android 1.0 ואילך) ו-v4 לרמת API 4 (מכשירים עם Android) 1.6 ומעלה). מידע נוסף על הערכים האלה זמין במסמך רמות ה-API של Android.

הערה: לא כל הגרסאות של Android תומכות בכל ערכי האישור. שימוש במאפיין חדש באופן מרומז מוסיף את תוחם גרסת הפלטפורמה כדי שמכשירים ישנים יותר יוכלו להתעלם ממנו. לדוגמה, שימוש ב- תוחם w600dp כולל באופן אוטומטי את הערך v13, כי תוחם הרוחב הזמין היה חדש ברמת API 13. כדי להימנע מבעיות, מומלץ תמיד לכלול קבוצה של משאבי ברירת מחדל (קבוצת משאבים ללא מאפיינים). מידע נוסף זמין במאמר הקטע התאמה הטובה ביותר למכשירים עם משאבים.

כללים למתן שמות למזהה

הנה כמה כללים לגבי השימוש בשמות של מגדיר התצורה:

  • ניתן לציין מספר ערכי אישור לקבוצה אחת של משאבים, ולהפריד ביניהם במקפים. עבור לדוגמה, המדיניות drawable-en-rUS-land חלה על מכשירים באנגלית ארה"ב בפריסה לרוחב לכיוון מסוים.
  • ערכי ההפרדה חייבים להיות בסדר שמוצג בטבלה 2.
    • שגוי: drawable-hdpi-port/
    • נכון: drawable-port-hdpi/
  • אי אפשר ליצור ספריות משאבים חלופיות כספריות מקוננות. לדוגמה, לא ניתן לכתוב res/drawable/drawable-en/
  • הערכים לא תלויי-רישיות. המהדר של המשאבים ממיר שמות ספריות לאותיות קטנות לפני העיבוד כדי למנוע בעיות הקשורות לאותיות לא תלויות-רישיות. מערכות קבצים. כל שימוש באותיות רישיות בשמות נועד רק לשיפור הקריאוּת.
  • יש תמיכה בערך אחד בלבד לכל סוג מזהה. לדוגמה, אם רוצים להשתמש אותם קבצים ניתנים להזזה לספרד ולצרפת, לא ניתן להשתמש בספרייה בשם drawable-es-fr/. במקום זאת, אתם צריכים שתי ספריות משאבים, כמו drawable-es/ ו-drawable-fr/, שמכילים את הקבצים המתאימים. עם זאת, לא צריך לשכפל את הקבצים בשני המיקומים בפועל. במקום זאת, יכול ליצור כינוי למשאב, כפי שמתואר במאמר יצירה משאבים חלופיים.

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

אם אין מקורות מידע חלופיים שתואמים לחיפוש בתצורה מסוימת של המכשיר, מערכת Android משתמשת במשאבי ברירת המחדל המתאימים – קבוצת משאבים לסוג משאב מסוים שלא כולל הגדרות אישיות מגדיר.

יצירת משאבים חלופיים

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

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

לדוגמה, נניח שיש לך סמל אפליקציה, icon.png, ואתה זקוק לגרסה ייחודית של אותו ללוקאלים שונים. עם זאת, שני לוקאלים, אנגלית-קנדית וצרפתית-קנדית, משתמשים באותה גרסה. אין צורך להעתיק את אותה התמונה במאגר המשאבים גם באנגלית-קנדית וגם בצרפתית-קנדית. במקום זאת, אפשר לשמור את התמונה שמשמשת גם לכל שם שאינו icon.png, כמו icon_ca.png, ו-put אותו בספריית ברירת המחדל res/drawable/. לאחר מכן יוצרים קובץ icon.xml ב-res/drawable-en-rCA/ וב-res/drawable-fr-rCA/ שמפנה אל icon_ca.png באמצעות הרכיב <bitmap>. כך ניתן לאחסן רק גרסה אחת של קובץ PNG ושני קובצי XML קטנים שמצביעים אליו. ראו את הדוגמאות בקטעים הבאים. לקבלת פרטים.

ניתן להזזה

כדי ליצור כינוי למכשיר קיים להזזה, צריך להשתמש ברכיב <drawable>:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <drawable name="icon">@drawable/icon_ca</drawable>
</resources>

אם יש לך אפשרות לשמור את הקובץ הזה כ-icon.xml במקום אחר הוא עבר הידור של ספריית המשאבים, כמו res/values-en-rCA/. למשאב שאפשר להפנות אליו בתור R.drawable.icon, אבל למעשה כינוי למשאב R.drawable.icon_ca, נשמרה ברשימה res/drawable/.

פריסה

כדי ליצור כינוי לפריסה קיימת, צריך להשתמש ב-<include> רכיב, מוקף ב-<merge>:

<?xml version="1.0" encoding="utf-8"?>
<merge>
    <include layout="@layout/main_ltr"/>
</merge>

אם הקובץ הזה יישמר בתור main.xml, הוא יעובד למשאב שאפשר להפנות אליו בתור R.layout.main, אבל הוא למעשה כינוי של R.layout.main_ltr משאב.

מחרוזות וערכים פשוטים אחרים

כדי ליצור כינוי למחרוזת קיימת, משתמשים במזהה המשאב של מחרוזת בתור הערך של המחרוזת החדשה:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="hello">Hello</string>
    <string name="hi">@string/hello</string>
</resources>

המשאב R.string.hi הוא עכשיו כינוי של R.string.hello.

ערכים פשוטים אחרים פועלים באותה דרך, למשל צבעים:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="red">#f00</color>
    <color name="highlight">@color/red</color>
</resources>

גישה למשאבי האפליקציה

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

כשהאפליקציה עוברת הידור, aapt יוצר את המחלקה R, שמכילה מזהי המשאבים של כל המשאבים בספרייה res/. לכל סוג משאב, יש תת-מחלקה R, כמו R.drawable לכל המשאבים שניתנים להזזה. לכל משאב מהסוג הזה יש מספר שלם סטטי, למשל R.drawable.icon. המספר השלם הזה הוא מזהה המשאב שבו אפשר להשתמש כדי לאחזר את המשאב.

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

  • סוג המשאב: כל משאב מקובץ ל"סוג", כמו string, drawable ו-layout. אפשר לקרוא מידע נוסף על הסוגים השונים במאמר סקירה כללית של סוגי המשאבים.
  • שם המשאב, שהוא שם הקובץ לא כולל את התוסף או את הערך במאפיין XML android:name, אם הוא ערך פשוט, כמו מחרוזת.

יש שתי דרכים לגשת למשאב:

  • בקוד: משתמש במספר שלם סטטי ממחלקה משנית של R class, כמו:
    R.string.hello

    string הוא סוג המשאב ו-hello הוא שם המשאב. יש הרבה ממשקי API של Android שיכולים לגשת למשאבים שלכם כשמציינים מזהה משאב בפורמט הזה. לקבלת מידע נוסף מידע נוסף ראה את הקטע גישה למשאבים בקוד.

  • ב-XML: באמצעות תחביר XML מיוחד שתואם מזהה המשאב שהוגדר במחלקה R, למשל:
    @string/hello

    string הוא סוג המשאב ו-hello הוא שם המשאב. אפשר להשתמש במשאב XML בכל מקום שבו צפוי ערך שתספקו במשאב. לקבלת מידע נוסף מידע נוסף זמין בקטע גישה למשאבים מ-XML.

גישה למשאבים בקוד

כדי להשתמש במשאב בקוד, תוכלו להעביר את מזהה המשאב כפרמטר של שיטה. עבור לדוגמה, אפשר להגדיר ש-ImageView ישתמש בפונקציה res/drawable/myimage.png משאב שמשתמש ב-setImageResource():

Kotlin

val imageView = findViewById(R.id.myimageview) as ImageView
imageView.setImageResource(R.drawable.myimage)

Java

ImageView imageView = (ImageView) findViewById(R.id.myimageview);
imageView.setImageResource(R.drawable.myimage);

אפשר גם לאחזר משאבים בודדים באמצעות methods ב-Resources, שבהן אפשר לקבל מופע של עם getResources().

תחביר

זהו התחביר להפניה למשאב בקוד:

[<package_name>.]R.<resource_type>.<resource_name>
  • <package_name> הוא שם החבילה שבה המשאב נמצא (לא שנדרשים כשאתם מפנים למשאבים מהחבילה שלכם).
  • <resource_type> הוא מחלקה המשנה R של סוג המשאב.
  • <resource_name> הוא שם הקובץ של המשאב ללא סיומת או ערך מאפיין android:name ברכיב ה-XML, בערכים פשוטים.

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

תרחישים לדוגמה

יש הרבה שיטות שמקבלות פרמטר של מזהה משאב, ואפשר לאחזר משאבים באמצעות ב-Resources. שלך יכול לקבל מופע של Resources באמצעות Context.getResources().

הנה כמה דוגמאות לגישה למשאבים בקוד:

Kotlin

// Load a background for the current screen from a drawable resource.
window.setBackgroundDrawableResource(R.drawable.my_background_image)

// Set the Activity title by getting a string from the Resources object, because
//  this method requires a CharSequence rather than a resource ID.
window.setTitle(resources.getText(R.string.main_title))

// Load a custom layout for the current screen.
setContentView(R.layout.main_screen)

// Set a slide in animation by getting an Animation from the Resources object.
flipper.setInAnimation(AnimationUtils.loadAnimation(this,
        R.anim.hyperspace_in))

// Set the text on a TextView object using a resource ID.
val msgTextView = findViewById(R.id.msg) as TextView
msgTextView.setText(R.string.hello_message)

Java

// Load a background for the current screen from a drawable resource.
getWindow().setBackgroundDrawableResource(R.drawable.my_background_image) ;

// Set the Activity title by getting a string from the Resources object, because
//  this method requires a CharSequence rather than a resource ID.
getWindow().setTitle(getResources().getText(R.string.main_title));

// Load a custom layout for the current screen.
setContentView(R.layout.main_screen);

// Set a slide in animation by getting an Animation from the Resources object.
flipper.setInAnimation(AnimationUtils.loadAnimation(this,
        R.anim.hyperspace_in));

// Set the text on a TextView object using a resource ID.
TextView msgTextView = (TextView) findViewById(R.id.msg);
msgTextView.setText(R.string.hello_message);

זהירות: אל תשנו את הקובץ R.java באופן ידני. הוא נוצר על ידי הכלי aapt כשהפרויקט שעברה הידור. השינויים יבוטלו בפעם הבאה שתתבצע הידור.

גישה למשאבים מ-XML

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

לדוגמה, אם מוסיפים Button לפריסה, משתמשים ב- משאב מחרוזת לטקסט הלחצן:

<Button
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/submit" />

תחביר

זהו התחביר להפניה למשאב במשאב XML:

@[<package_name>:]<resource_type>/<resource_name>
  • <package_name> הוא שם החבילה שבה נמצא המשאב (לא שנדרשת כשפונים למשאבים מאותה חבילה).
  • <resource_type> הוא/היא מחלקה משנית R לסוג המשאב.
  • <resource_name> הוא שם הקובץ של המשאב ללא סיומת או ערך מאפיין android:name ברכיב ה-XML, בשביל בערכים פשוטים.

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

תרחישים לדוגמה

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

<?xml version="1.0" encoding="utf-8"?>
<resources>
   <color name="opaque_red">#f00</color>
   <string name="hello">Hello!</string>
</resources>

אפשר להשתמש במשאבים האלה בקובץ הפריסה הבא כדי להגדיר את צבע הטקסט מחרוזת טקסט:

<?xml version="1.0" encoding="utf-8"?>
<EditText xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:textColor="@color/opaque_red"
    android:text="@string/hello" />

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

<?xml version="1.0" encoding="utf-8"?>
<EditText xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:textColor="@android:color/secondary_text_dark"
    android:text="@string/hello" />

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

אפשר אפילו להשתמש במשאבים ב-XML כדי ליצור כינויים. לדוגמה, אפשר ליצור משאב שניתן להזזה שהוא כינוי של משאב אחר שניתן להזזה:

<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/other_drawable" />

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

מאפייני סגנון של קובץ עזר

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

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

?[<package_name>:][<resource_type>/]<resource_name>

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

<EditText id="text"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:textColor="?android:textColorSecondary"
    android:text="@string/hello_world" />

כאן, המאפיין android:textColor מציין את השם של מאפיין סגנון בעיצוב הנוכחי. מערכת Android משתמשת עכשיו בערך שהוחל על android:textColorSecondary בתור הערך של android:textColor בווידג'ט הזה. כי המערכת שבהקשר הזה נדרש משאב מאפיין, אתם לא צריכים לציין במפורש את הסוג, ?android:attr/textColorSecondary אפשר להחריג את הסוג attr.

גישה לקבצים המקוריים

למרות שהדבר לא נפוץ, ייתכן שתזדקקו לגשת לקבצים ולספריות המקוריים שלכם. אם תעשו זאת, לא ניתן לשמור את הקבצים ב-res/ מפני שהדרך היחידה לקרוא משאב res/ עם מזהה המשאב. במקום זאת, תוכלו לשמור את המשאבים שלכם ספריית assets/.

קבצים שנשמרו בספרייה assets/ לא מקבלים משאב מזהה, כך שלא ניתן להפנות אליהם דרך המחלקה R או ממשאבי XML. במקום זאת, אפשר קובצי שאילתות בספרייה assets/ כמו במערכת קבצים רגילה, וקוראים נתונים גולמיים באמצעות AssetManager.

עם זאת, אם הדבר היחיד שדרוש לך הוא יכולת לקרוא נתונים גולמיים (כמו קובץ וידאו או אודיו), לאחר מכן שומרים את הקובץ בספרייה res/raw/ וקוראים זרם של בייטים באמצעות openRawResource().

משאבי פלטפורמת גישה

ב-Android יש מספר משאבים סטנדרטיים, כמו סגנונות, עיצובים ופריסות. שפת תרגום לגשת למשאבים האלה, להגדיר את ההפניה למשאבים באמצעות שם החבילה android. לדוגמה, Android מספק משאב פריסה שאפשר להשתמש בו פריטים ב-ListAdapter:

Kotlin

listAdapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, myarray)

Java

setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, myarray));

בדוגמה הזו, simple_list_item_1 הוא משאב פריסה שמוגדר על ידי פלטפורמה לפריטים ב-ListView. אפשר להשתמש בה במקום ליצור פריסה משלך של פריטים ברשימה.

התאימות הטובה ביותר למכשירים עם משאבים

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

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

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

באופן דומה, אם מספקים משאבי פריסה שונים בהתאם לכיוון המסך, בוחרים כיוון אחד כברירת המחדל. לדוגמה, במקום לספק משאבי פריסה ב-layout-land/ לרוחב וב-layout-port/ לאורך, צריך להשאיר אחד כברירת המחדל, כמו layout/ לפורמט לרוחב ו-layout-port/ לפורמט לאורך.

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

לדוגמה: אם הערך בשדה minSdkVersion הוא 4, וכל המשאבים שניתנים להזזה עומדים בדרישות באמצעות מצב לילה (night או notnight, שנוספו דרך API). רמה 8), אז מכשיר ברמת API 4 לא יכול לגשת למשאבים שניתנים להזזה ולקריסות. כאן כנראה שתרצו ש-notnight יהיו משאבי ברירת המחדל שלכם, לכן אל כוללים את תוחם ולהציב את המשאבים שניתנים להזזה ב-drawable/ או ב-drawable-night/.

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

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

איך מערכת Android מוצאת את המשאב המתאים ביותר

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

drawable/
drawable-en/
drawable-fr-rCA/
drawable-en-port/
drawable-en-notouch-12key/
drawable-port-ldpi/
drawable-port-notouch-12key/

ונניח שהגדרת המכשיר היא:

לוקאל = en-GB
כיוון המסך = port
דחיסות הפיקסלים במסך = hdpi
סוג מסך המגע = notouch
שיטת הקלט הראשית של הטקסט = 12key

מערכת Android משווה בין ההגדרות של המכשיר למשאבים החלופיים הזמינים. פריטים שניתן להזזה החל מ-drawable-en-port.

המערכת מחליטה באילו משאבים להשתמש עם הרכיבים הבאים לוגיקה:

איור 2. תרשים זרימה של האופן שבו מערכת Android מוצאת את המקור המתאים ביותר.

  1. להסיר קובצי משאבים שסותרים את תצורת המכשיר.

    הספרייה drawable-fr-rCA/ הוסרה כי היא שסותר את הלוקאל en-GB.

    drawable/
    drawable-en/
    drawable-fr-rCA/
    drawable-en-port/
    drawable-en-notouch-12key/
    drawable-port-ldpi/
    drawable-port-notouch-12key/
    

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

  2. מוצאים ברשימה את תוחם הקדימות הבא (טבלה 2). (מתחילים עם חשבון ניהול (MCC).)
  3. האם חלק מספריות המשאבים כוללות את המזהה הזה?
    • אם לא, חוזרים לשלב השני ובודקים את הערך הבא. במשפט הזה, התשובה היא 'לא' עד שמגיעים לערך השפה.
    • אם כן, ממשיכים לשלב הרביעי.
  4. מסירים ספריות משאבים שלא כוללות את התו המגדיר הזה. בדוגמה הזאת, המערכת לאחר מכן כל הספריות שלא כוללות תוחם שפה:
    drawable/
    drawable-en/
    drawable-en-port/
    drawable-en-notouch-12key/
    drawable-port-ldpi/
    drawable-port-notouch-12key/
    

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

  5. חוזרים על שלבים שתיים, שלוש וארבע עד שתישאר רק ספרייה אחת. בדוגמה הזו, המסך הוא ערך האישור הבא שעבורו יש התאמות. לכן, משאבים שלא מציינים את כיוון המסך יוסרו:
    drawable-en/
    drawable-en-port/
    drawable-en-notouch-12key/
    

    הספרייה שנותרה היא drawable-en-port.

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

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

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

הערה: הקדימות של ערך האישור (בטבלה 2) חשובה יותר את מספר המזהים שתואמים בדיוק למכשיר. בדוגמה הקודמת, בשלב ארבע האפשרות האחרונה ברשימה כוללת שלושה מאפיינים שתואמים בדיוק למכשיר (כיוון, סוג מסך המגע ושיטת הקלט), ואילו ב-drawable-en יש רק פרמטר אחד שתואם (שפה). עם זאת, לשפה יש קדימות גבוהה יותר מהמגדירים האחרים האלו, לכן drawable-port-notouch-12key הוסר.