מושגים ויישום ב-Jetpack Compose
משאבים הם הקבצים הנוספים והתוכן הסטטי שבהם הקוד משתמש, כמו מפות סיביות, הגדרות פריסה, מחרוזות של ממשק משתמש, הוראות אנימציה ועוד.
תמיד כדאי להוציא משאבים של אפליקציות כמו תמונות ומחרוזות מהקוד, כדי שתוכלו לנהל אותם בנפרד. בנוסף, אפשר לספק משאבים חלופיים להגדרות ספציפיות של מכשירים על ידי קיבוץ שלהם בספריות משאבים עם שמות מיוחדים. בזמן הריצה, מערכת 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.
טבלה 1. ספריות משאבים נתמכות בתוך ספריית הפרויקט res/.
ספרייה |
Resource Type |
|
|
קובצי XML שמגדירים אנימציות של מאפיינים. |
|
|
קובצי XML שמגדירים אנימציות Tween. אפשר לשמור בספרייה הזו גם אנימציות של מאפיינים, אבל עדיף לשמור אותן בספרייה |
|
|
קובצי XML שמגדירים רשימת צבעים של מצב. מידע נוסף זמין במאמר בנושא משאב של רשימת מצבי צבע. |
|
|
קובצי מפת סיביות (PNG, .
מידע נוסף זמין במאמר משאבים מסוג Drawable. |
|
|
קבצים של רכיבי ציור לצפיפויות שונות של סמלי מרכז האפליקציות. מידע נוסף על ניהול סמלים של מרכז האפליקציות באמצעות תיקיות |
|
|
קובצי XML שמגדירים פריסה של ממשק משתמש. מידע נוסף זמין במאמר בנושא משאב פריסה. |
|
|
קובצי XML שמגדירים תפריטים של אפליקציות, כמו תפריט אפשרויות, תפריט הקשר או תפריט משנה. מידע נוסף מופיע במאמר משאב תפריט. |
|
|
קבצים שרירותיים לשמירה בפורמט גולמי. כדי לפתוח את המשאבים האלה באמצעות עם זאת, אם אתם צריכים גישה לשמות הקבצים המקוריים ולהיררכיית הקבצים, כדאי לשמור את המשאבים בספרייה |
|
|
קובצי XML שמכילים ערכים פשוטים, כמו מחרוזות, מספרים שלמים וצבעים. לעומת זאת, קובצי משאבים בפורמט XML בספריות משנה אחרות של כל משאב מוגדר באמצעות רכיב XML משלו, כך שאפשר לתת לקובץ כל שם שרוצים ולכלול בו סוגים שונים של משאבים. עם זאת, לשם הבהרה, כדאי להציב סוגים ייחודיים של משאבים בקבצים שונים. לדוגמה, אלה מוסכמות לשמות קבצים של משאבים שאפשר ליצור בספרייה הזו:
מידע נוסף זמין במאמרים משאבי מחרוזות, משאבי סגנון וסוגים נוספים של משאבים. |
|
|
קובצי XML שרירותיים שאפשר לקרוא בזמן הריצה על ידי קריאה ל- |
|
|
קובצי גופנים עם סיומות כמו TTF, OTF או TTC, או קובצי XML שכוללים אלמנט |
המשאבים ששומרים בספריות המשנה שמוגדרות בטבלה 1 הם משאבי ברירת המחדל. כלומר, המשאבים האלה מגדירים את העיצוב ואת התוכן שמוגדרים כברירת מחדל באפליקציה. עם זאת, יכול להיות שסוגים שונים של מכשירים עם מערכת Android ידרשו סוגים שונים של משאבים.
לדוגמה, אתם יכולים לספק משאבי פריסה שונים למכשירים עם מסכים גדולים מהרגיל, כדי לנצל את שטח המסך הנוסף. אפשר גם לספק משאבי מחרוזות שונים שמתרגמים את הטקסט בממשק המשתמש על סמך הגדרת השפה במכשיר. כדי לספק את המשאבים השונים האלה להגדרות שונות של מכשירים, צריך לספק משאבים חלופיים בנוסף למשאבי ברירת המחדל.
לספק משאבים חלופיים
רוב האפליקציות מספקות משאבים חלופיים לתמיכה בהגדרות ספציפיות של מכשירים. לדוגמה, כדאי לכלול משאבים חלופיים של drawable לדחיסויות מסך שונות ומשאבים חלופיים של מחרוזות לשפות שונות. בזמן הריצה, מערכת Android מזהה את הגדרות המכשיר הנוכחיות וטוענת את המשאבים המתאימים לאפליקציה.

איור 1. שני מכשירים שמשתמשים במשאבי פריסה שונים על סמך גודל המסך.
כדי לציין חלופות ספציפיות להגדרות עבור קבוצת משאבים, מבצעים את הפעולות הבאות:
יוצרים ספרייה חדשה ב-
res/בשם<resources_name>-<qualifier>.-
<resources_name>הוא שם הספרייה של משאבי ברירת המחדל התואמים (מוגדר בטבלה 1). -
<qualifier>הוא שם שמציין הגדרה ספציפית שבה יש להשתמש במשאבים האלה (מוגדר בטבלה 2).
אפשר לצרף יותר מ-
<qualifier>אחד. מפרידים בין כל אחד מהם באמצעות מקף.-
שומרים את המשאבים החלופיים המתאימים בספרייה החדשה. שמות קובצי המשאבים צריכים להיות זהים בדיוק לשמות קובצי המשאבים שמוגדרים כברירת מחדל.
לדוגמה, אלה כמה משאבים שמוגדרים כברירת מחדל וכמה משאבים חלופיים:
res/
drawable/
icon.png
background.png
drawable-hdpi/
icon.png
background.png
המסווג hdpi מציין שהמשאבים בספרייה הזו מיועדים למכשירים עם מסך עם צפיפות פיקסלים גבוהה. התמונות בספריות האלה מותאמות לצפיפות מסך ספציפית, אבל שמות הקבצים זהים לחלוטין.
כך, מזהה המשאב שמשמש להפניה לתמונה icon.png או background.png תמיד יהיה זהה. מערכת Android בוחרת את הגרסה של כל משאב שהכי מתאימה למכשיר הנוכחי על ידי השוואה בין פרטי ההגדרה של המכשיר לבין המאפיינים בשם של ספריית המשאבים.
בטבלה 2 מפורטים המגדירים התקינים של ההגדרות לפי סדר העדיפות. אפשר להוסיף כמה מסווגים לשם של ספרייה אחת, ולהפריד בין המסווגים באמצעות מקף. אם משתמשים בכמה פרמטרים לציון מיקום בספריית משאבים, צריך להוסיף אותם לשם הספרייה לפי הסדר שבו הם מופיעים בטבלה.
טבלה 2. שמות של מחרוזות להגדרת תצורה.
הגדרות אישיות |
ערכי מגדיר |
תיאור |
קוד MCC וקוד MNC |
דוגמאות:
|
קוד מדינה של רשת סלולרית (MCC), שאחריו יכול להופיע קוד הרשת הסלולרית (MNC) מכרטיס ה-SIM במכשיר. לדוגמה, אם המכשיר משתמש בחיבור רדיו (כלומר, אם זה טלפון GSM), ערכי ה-MCC וה-MNC מגיעים מכרטיס ה-SIM. אפשר גם להשתמש רק ב-MCC, למשל כדי לכלול באפליקציה משאבים משפטיים שספציפיים למדינה. אם אתם צריכים לציין על סמך השפה בלבד, אתם יכולים להשתמש במקום זאת במאפיין המסווג שפה, סקריפט (אופציונלי) ואזור (אופציונלי). אם אתם משתמשים במזהה MCC ובמזהה MNC כמאפייני סינון, עליכם לעשות זאת בזהירות ולבדוק שהם פועלים כמצופה. אפשר גם לראות את שדות ההגדרה |
שפה, כתב (אופציונלי) ואזור (אופציונלי) |
דוגמאות:
|
השפה מוגדרת באמצעות קוד שפה בן שתי אותיות לפי ISO 639-2{:.external}, שאחריו יכול להיות קוד אזור בן שתי אותיות לפי ISO 3166-1-alpha-2{:.external} (לפניו האותיות הקטנות הקודים לא תלויי אותיות רישיות (case-sensitive). הקידומת ב-Android 7.0 (רמת API 24) נוספה תמיכה בתגי שפה של BCP 47{:.external}, שאפשר להשתמש בהם כדי להגדיר משאבים ספציפיים לשפה ולאזור. תג שפה מורכב מרצף של תגי משנה אחד או יותר, וכל אחד מהם מצמצם או משפר את טווח השפה שמזוהה על ידי התג הכולל. מידע נוסף על תגי שפה זמין במאמר תגים לזיהוי שפות{:.external}. כדי להשתמש בתג שפה לפי BCP 47, צריך לשרשר את תג השפה יכול להשתנות במהלך השימוש באפליקציה אם המשתמשים משנים את השפה בהגדרות המערכת. מידע על ההשפעה של השינוי הזה על האפליקציה במהלך זמן הריצה זמין במאמר טיפול בשינויים בהגדרות. מדריך מלא להתאמת האפליקציה לשפות אחרות זמין במאמר התאמת האפליקציה לשוק המקומי. אפשר גם לעיין ב-method |
| לשון הפנייה | masculinefeminineneuter |
המגדר הדקדוקי של המשתמש. משמש לשפות שיש בהן מגדר דקדוקי. לדוגמה, אם אתם צריכים לספק משאבים שונים למשתמשים דוברי צרפתית, אתם יכולים להשתמש בספריות כמו אלה:
מידע נוסף מופיע בקטע לשון פנייה ב-Android. אפשר גם לעיין בשיטת ההגדרה נוסף ברמת API 34. |
כיוון הפריסה |
|
כיוון הפריסה של האפליקציה. ההגדרה הזו יכולה לחול על כל משאב, כמו פריסות, משאבים שניתנים לציור או ערכים. לדוגמה, אם רוצים לספק פריסה ספציפית לשפה הערבית ופריסה כללית לכל שפה אחרת שמוצגת מימין לשמאל, כמו פרסית או עברית, אפשר להשתמש בספריות כמו אלה: הערה: כדי להפעיל תכונות של פריסה מימין לשמאל באפליקציה, צריך להגדיר את נוסף ברמת API 17. |
הרוחב הקטן ביותר |
דוגמאות:
וכו' |
המימד הקצר ביותר של אזור המסך שזמין לאפליקציה. באופן ספציפי, לדוגמה, אם הפריסה שלכם דורשת שהמימד הקטן ביותר של אזור המסך יהיה לפחות 600dp בכל זמן, אתם יכולים להשתמש במאפיין הזה כדי ליצור את משאבי הפריסה בספרייה שימוש ברוחב הקטן ביותר כדי לקבוע את הגודל הכללי של המסך הוא שימושי, כי הרוחב הוא לרוב הגורם המניע בתכנון פריסה. בדרך כלל הממשק משתנה אנכית, אבל יש מגבלות די קשיחות לגבי המרחב המינימלי שהוא צריך אופקית. הרוחב הזמין הוא גם הגורם העיקרי שקובע אם להשתמש בפריסת חלונית אחת בטלפונים ניידים או בפריסת חלונות מרובים בטאבלטים. לכן, סביר להניח שהכי חשוב לכם לדעת מה הרוחב הקטן ביותר האפשרי בכל מכשיר. הרוחב הקטן ביותר של מכשיר לוקח בחשבון את הקישוטים של המסך ואת ממשק המשתמש של המערכת. לדוגמה, אם במכשיר יש רכיבי ממשק משתמש קבועים במסך שתופסים מקום לאורך הציר של הרוחב הקטן ביותר, המערכת תגדיר את הרוחב הקטן ביותר כקטן יותר מגודל המסך בפועל, כי אלה פיקסלים במסך שלא זמינים לממשק המשתמש שלכם. כמה ערכים שאפשר להשתמש בהם כאן לגדלים נפוצים של מסכים:
כשהאפליקציה מספקת כמה ספריות משאבים עם ערכים שונים של המסווג נוסף ברמת API 13. אפשר גם לעיין במאפיין מידע נוסף על עיצוב למסכים שונים באמצעות התנאי הזה זמין במאמר עיצוב רספונסיבי/אדפטיבי באמצעות תצוגות. |
רוחב וגובה זמינים |
דוגמאות:
וכו' |
המאפיין הזה מציין את הרוחב או הגובה המינימליים של המסך (ב הרוחב והגובה הזמינים שימושיים בדרך כלל כדי לקבוע אם להשתמש בפריסה מרובת חלונות, כי גם בטאבלט לרוב לא רוצים להשתמש באותה פריסה מרובת חלונות עבור מצב אנכי ועבור מצב אופקי. לכן, אפשר להשתמש בהם כדי לציין את הרוחב ו/או הגובה המינימליים שנדרשים לפריסה, במקום להשתמש בשני המסננים של גודל המסך והכיוון ביחד. אם האפליקציה מספקת כמה ספריות משאבים עם ערכים שונים להגדרות האלה, המערכת משתמשת בספרייה שהערך שלה הכי קרוב לרוחב המסך הנוכחי של המכשיר (בלי לחרוג ממנו). הערך הכי קרוב ל- נקבע על ידי חיבור ההפרשים בין רוחב המסך בפועל לבין הרוחב שצוין, לבין ההפרש בין גובה המסך בפועל לבין הגובה שצוין. אם לא צוינו גובה ורוחב, הערך הוא 0. הערכים לא כוללים את האזור שמוקצה לשוליים של חלון, כך שאם במכשיר יש רכיבי ממשק משתמש קבועים בקצוות המסך, הערכים של הרוחב והגובה קטנים יותר מהמידות האמיתיות של המסך, גם כשהאפליקציה מוצגת מקצה לקצה באמצעות חלק מהקישוטים של המסך במצב אנכי שלא קבועים (כמו שורת הסטטוס של הטלפון שאפשר להסתיר אותה במסך מלא) לא נכללים כאן, וגם לא קישוטי חלונות כמו סרגל הכותרת או סרגל הפעולות. לכן, האפליקציות צריכות להיות מוכנות להתמודד עם שטח קטן יותר ממה שהן מציינות. הערה: המערכת בוחרת את הנכס שתואם גם לרוחב וגם לגובה. לכן, עדיף להשתמש במשאב שמציין את שניהם מאשר במשאב שמציין רק אחד מהם. לדוגמה, אם המסך בפועל הוא ברוחב של 720dp ובגובה של 1280dp, ומשאב אחד מוגדר כ-w720dp ומשאב אחר מוגדר כ-w700dp-h1200dp, המשאב השני ייבחר למרות שהראשון הוא התאמה מדויקת למה שהוא מציין. נוסף ברמת API 13. אפשר גם לראות את שדות ההגדרה מידע נוסף על עיצוב למסכים שונים באמצעות התנאי הזה זמין במאמר עיצוב רספונסיבי/אדפטיבי באמצעות תצוגות. |
גודל המסך |
|
הערה: שימוש במגביל גודל לא אומר שהמשאבים מיועדים רק למסכים בגודל הזה. אם לא תספקו משאבים חלופיים עם מגדירים שתואמים טוב יותר לתצורת המכשיר הנוכחית, המערכת תוכל להשתמש במשאבים שהם ההתאמה הטובה ביותר. זהירות: אם כל המשאבים משתמשים במגדיר גודל שהוא גדול יותר מהמסך הנוכחי, המערכת לא משתמשת בהם והאפליקציה קורסת בזמן הריצה. לדוגמה, זה קורה אם כל משאבי הפריסה מתויגים במגדיר נוסף ברמת API 4. אפשר גם לעיין בשדה ההגדרה |
יחס הגובה-רוחב של המסך |
|
נוסף ברמת API 4. ההגדרה הזו מבוססת אך ורק על יחס הגובה-רוחב של המסך (מסך אפשר גם לעיין בשדה ההגדרה |
מסך עגול |
|
נוסף ברמת API 23. אפשר גם לעיין בשיטת ההגדרה |
Wide Color Gamut |
|
נוסף ברמת API 26. אפשר גם לעיין בשיטת ההגדרה |
טווח דינמי גבוה (HDR) |
|
נוסף ברמת API 26. אפשר גם לעיין בשיטת ההגדרה |
כיוון המסך |
|
הערך הזה יכול להשתנות במהלך השימוש באפליקציה אם המשתמש מסובב את המסך. מידע על ההשפעה של השינוי הזה על האפליקציה במהלך זמן הריצה זמין במאמר טיפול בשינויים בהגדרות. אפשר גם לעיין בשדה התצורה |
מצב ממשק המשתמש |
|
נוסף ברמת API 8; טלוויזיה נוספה ב-API 13; מכשיר ביתי נוסף ב-API 16; שעון נוסף ב-API 20; משקפי VR נוספו ב-API 26. לקבלת מידע על האופן שבו האפליקציה יכולה להגיב כשהמכשיר מוכנס או מוצא מאביזר עגינה, קראו את קביעת מצב וסוג העגינה ומעקב אחריהם. הערך הזה יכול להשתנות במהלך השימוש באפליקציה אם המשתמש מניח את המכשיר במעמד. אפשר להפעיל או להשבית חלק מהמצבים האלה באמצעות |
מצב לילה |
|
נוספה ברמת API 8. ההגדרה הזו יכולה להשתנות במהלך חיי האפליקציה אם מצב הלילה מוגדר למצב אוטומטי (ברירת מחדל). במקרה כזה, המצב משתנה בהתאם לשעה ביום. אפשר להפעיל או להשבית את המצב הזה באמצעות |
צפיפות פיקסלים במסך (dpi) |
|
יש יחס קנה מידה של 3:4:6:8:12:16 בין שש הצפיפויות העיקריות (בלי להתייחס לצפיפות tvdpi). לכן, מפת סיביות בגודל 9x9 ב-ldpi היא 12x12 ב-mdpi, 18x18 ב-hdpi, 24x24 ב-xhdpi וכן הלאה. הערה: שימוש במגדיר צפיפות לא מרמז שהמשאבים מיועדים רק למסכים עם הצפיפות הזו. אם לא מספקים משאבים חלופיים עם מסננים שתואמים יותר להגדרת המכשיר הנוכחית, המערכת משתמשת במשאבים שהם ההתאמה הטובה ביותר. מידע נוסף על טיפול בדחיסויות מסך שונות ועל האופן שבו מערכת Android עשויה לשנות את קנה המידה של מפות הביטים כדי להתאים לדחיסות הנוכחית זמין במאמר סקירה כללית על תאימות מסך. |
סוג מסך המגע |
|
אפשר גם לעיין בשדה ההגדרה |
זמינות המקלדת |
|
אם מציינים משאבי ההגדרה הזו יכולה להשתנות במהלך השימוש באפליקציה אם המשתמש פותח מקלדת חומרה. מידע על ההשפעה של השינוי הזה על האפליקציה במהלך זמן הריצה זמין במאמר טיפול בשינויים בהגדרות. אפשר גם לעיין בשדות ההגדרה |
שיטת קלט הטקסט העיקרית |
|
אפשר גם לעיין בשדה ההגדרה |
זמינות מקשי הניווט |
|
ההגדרה הזו יכולה להשתנות במהלך השימוש באפליקציה אם המשתמש חושף את מקשי הניווט. מידע על ההשפעה של השינוי הזה על האפליקציה במהלך זמן הריצה זמין במאמר טיפול בשינויים בהגדרות. אפשר גם לעיין בשדה ההגדרה |
שיטת הניווט העיקרית שאינה מבוססת על מגע |
|
אפשר גם לעיין בשדה ההגדרה |
גרסת פלטפורמה (רמת API) |
דוגמאות:
וכו' |
רמת ה-API שנתמכת על ידי המכשיר. לדוגמה, |
כללים למתן שמות למסננים
אלה כמה כללים לגבי השימוש בשמות של מסווגי תצורה:
- אפשר לציין כמה מסננים לקבוצת משאבים אחת, ולהפריד ביניהם באמצעות מקפים. לדוגמה,
drawable-en-rUS-landחל על מכשירים באנגלית אמריקאית בכיוון לרוחב. - המסננים צריכים להיות בסדר שמופיע בטבלה 2.
- שגוי:
drawable-hdpi-port/ - נכון:
drawable-port-hdpi/
- שגוי:
- אי אפשר להטמיע ספריות משאבים חלופיות בתוך ספריות אחרות. לדוגמה, אי אפשר להשתמש ב-
res/drawable/drawable-en/. - הערכים לא תלויי-רישיות. מהדר המשאבים ממיר את שמות הספריות לאותיות קטנות לפני העיבוד, כדי למנוע בעיות במערכות קבצים שלא מבחינות בין אותיות רישיות לאותיות קטנות. השימוש באותיות רישיות בשמות הוא רק כדי לשפר את הקריאות.
- המערכת תומכת רק בערך אחד לכל סוג של תנאי. לדוגמה, אם רוצים להשתמש באותם קובצי drawable בספרד ובצרפת, אי אפשר ליצור ספרייה בשם
drawable-es-fr/. במקום זאת, צריך שיהיו שתי ספריות משאבים, כמוdrawable-es/ו-drawable-fr/, שמכילות את הקבצים המתאימים. עם זאת, לא צריך לשכפל את הקבצים בפועל בשני המיקומים. במקום זאת, אפשר ליצור כינוי למשאב, כמו שמתואר בקטע יצירת משאבי כינוי.
אחרי ששומרים משאבים חלופיים בספריות ששמן כולל את המסווגים האלה, מערכת Android מיישמת באופן אוטומטי את המשאבים באפליקציה על סמך הגדרת המכשיר הנוכחית. בכל פעם שמבוקש משאב, מערכת Android בודקת אם יש ספריות משאבים חלופיות שמכילות את קובץ המשאב המבוקש, ואז מאתרת את המשאב שהכי מתאים.
אם אין משאבים חלופיים שתואמים להגדרת מכשיר מסוימת, מערכת Android משתמשת במשאבי ברירת המחדל המתאימים – קבוצת המשאבים של סוג משאב מסוים שלא כוללת מזהה תצורה.
יצירת משאבים של כתובות אימייל חלופיות
אם יש לכם משאב שאתם רוצים להשתמש בו ביותר מהגדרת מכשיר אחת, אבל אתם לא רוצים לספק אותו כמשאב ברירת מחדל, אתם לא צריכים להוסיף את אותו משאב ליותר מספריית משאבים חלופית אחת. במקום זאת, אתם יכולים ליצור משאב חלופי שמשמש ככינוי למשאב שנשמר בספריית המשאבים שמוגדרת כברירת מחדל.
לדוגמה, נניח שיש לכם סמל אפליקציה, icon.png, ואתם צריכים גרסה ייחודית שלו ללוקאלים שונים. עם זאת, בשני לוקאלים – אנגלית קנדית וצרפתית קנדית – צריך להשתמש באותה גרסה. אין צורך להעתיק את אותה תמונה לספריית המשאבים גם עבור אנגלית קנדית וגם עבור צרפתית קנדית.
במקום זאת, אפשר לשמור את התמונה שמשמשת לשניהם בכל שם חוץ מ
icon.png, למשל icon_ca.png, ולשים אותה בספרייה res/drawable/ שמוגדרת כברירת מחדל. לאחר מכן יוצרים קובץ icon.xml ב-res/drawable-en-rCA/ וב-res/drawable-fr-rCA/ שמפנה למשאב icon_ca.png באמצעות הרכיב <bitmap>. כך תוכלו לאחסן רק גרסה אחת של קובץ ה-PNG ושני קובצי XML קטנים שמפנים אליה. פרטים נוספים מופיעים בדוגמאות שבקטעים הבאים.
Drawable
כדי ליצור כינוי לרכיב drawable קיים, משתמשים באלמנט <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.
גישה למשאבי האפליקציה
אחרי שמספקים משאב באפליקציה, אפשר להחיל אותו באמצעות הפניה למזהה המשאב שלו. כל מזהי המשאבים מוגדרים במחלקה R של הפרויקט, שכלי aapt יוצר באופן אוטומטי.
כשמהדרים את האפליקציה, aapt יוצר את המחלקה R, שמכילה מזהי משאבים לכל המשאבים בספרייה res/. לכל סוג משאב יש מחלקת משנה R, כמו R.drawable לכל המשאבים הגרפיים. לכל משאב מהסוג הזה יש מספר שלם סטטי, למשל R.drawable.icon. מספר שלם שמייצג את מזהה המשאב שאפשר להשתמש בו כדי לאחזר את המשאב.
אף על פי שמזהי המשאבים מצוינים במחלקה R, לא צריך לחפש שם כדי למצוא מזהה משאב. מזהה משאב תמיד מורכב מהרכיבים הבאים:
- סוג המשאב: כל משאב מקובץ לפי סוג, למשל
string, drawableו-layout. מידע נוסף על הסוגים השונים זמין במאמר סקירה כללית על סוגי משאבים. - שם המשאב, שהוא שם הקובץ ללא הסיומת או הערך במאפיין
android:nameשל ה-XML, אם המשאב הוא ערך פשוט, כמו מחרוזת.
יש שתי דרכים לגשת למשאב:
- בקוד: שימוש במספר שלם סטטי ממחלקת משנה של המחלקה
R, למשל:R.string.hellostringהוא סוג המשאב ו-helloהוא שם המשאב. יש הרבה ממשקי API של Android שיכולים לגשת למשאבים שלכם אם תספקו מזהה משאב בפורמט הזה. מידע נוסף זמין בקטע גישה למשאבים בקוד. - ב-XML: באמצעות תחביר XML מיוחד שמתאים למזהה המשאב שמוגדר בכיתה
R, למשל:@string/hellostringהוא סוג המשאב ו-helloהוא שם המשאב. אפשר להשתמש בתחביר הזה במשאב XML בכל מקום שבו צפוי ערך שאתם מספקים במשאב. מידע נוסף זמין בקטע גישה למשאבים מ-XML.
גישה למשאבים בקוד
אפשר להשתמש במשאב בקוד על ידי העברת מזהה המשאב כפרמטר של method.
לדוגמה, אפשר להגדיר 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);
גישה למשאבים מ-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" />
זה אולי נשמע מיותר, אבל יכול להיות שימושי מאוד כשמשתמשים במשאב חלופי. מידע נוסף זמין בקטע בנושא יצירת משאבי כינוי.
מאפייני סגנון של קובץ עזר
משאב של מאפיין סגנון מאפשר להפנות לערך של מאפיין בערכת הנושא שמוחלת כרגע. הפניה למאפיין סגנון מאפשרת להתאים אישית את המראה של רכיבי ממשק המשתמש על ידי עיצוב שלהם כך שיתאימו לשינויים סטנדרטיים שסופקו על ידי ערכת הנושא הנוכחית, במקום לספק ערך מקודד. הפניה למאפיין סגנון בעצם אומרת: "צריך להשתמש בסגנון שמוגדר על ידי המאפיין הזה בעיצוב הנוכחי".
כדי להפנות למאפיין סגנון, תחביר השם כמעט זהה לפורמט המשאב הרגיל, אבל במקום הסמל @ (@) משתמשים בסימן שאלה (?). החלק של סוג המשאב הוא אופציונלי. לכן, תחביר ההפניה הוא:
?[<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) כדי להגדיר את כל משאבי ה-drawable, מכשיר ברמת API 4 לא יכול לגשת למשאבי ה-drawable וקורס. במקרה כזה, כדאי להגדיר את notnight כמשאבי ברירת המחדל, ולכן צריך להחריג את התנאי הזה ולהוסיף את משאבי ה-drawable ל-drawable/ או ל-drawable-night/.
בקיצור, כדי לספק את התאימות הכי טובה למכשירים, תמיד צריך לספק משאבי ברירת מחדל למשאבים שהאפליקציה צריכה כדי לפעול בצורה תקינה. לאחר מכן יוצרים משאבים חלופיים להגדרות ספציפיות של מכשירים באמצעות מסנני הגדרה.
יש יוצא מן הכלל אחד לכלל הזה: אם minSdkVersion של האפליקציה הוא 4 או יותר, לא צריך משאבי drawable שמוגדרים כברירת מחדל כשמספקים משאבי drawable חלופיים עם מסווג צפיפות המסך. גם
בלי משאבי ציור שמוגדרים כברירת מחדל, מערכת Android יכולה למצוא את ההתאמה הטובה ביותר בין צפיפויות המסך החלופיות ולשנות את קנה המידה של מפות הביטים לפי הצורך. עם זאת, כדי להשיג את חוויית השימוש הטובה ביותר בכל סוגי המכשירים, כדאי לספק משאבי drawable חלופיים לכל שלושת סוגי הצפיפות.