שימוש חוזר בפריסות עם <include>

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

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

יצירת פריסה לשימוש חוזר

מתחילים ביצירת קובץ XML חדש ומגדירים את הפריסה שבה רוצים להשתמש שוב. עבור הנה פריסה, למשל, שמגדירה סרגל כותרת שצריך לכלול בכל פעילות. (titlebar.xml):

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/titlebar_bg"
    tools:showIn="@layout/activity_main" >

    <ImageView android:layout_width="wrap_content"
               android:layout_height="wrap_content"
               android:src="@drawable/gafricalogo" />
</FrameLayout>

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

משתמשים בפרמטר <include> תג

בתוך הפריסה שבה רוצים להוסיף את הרכיב לשימוש חוזר, מוסיפים את תג <include>. לדוגמה, זוהי פריסה שכוללת את סרגל הכותרת מ- בדוגמה הקודמת:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/app_bg"
    android:gravity="center_horizontal">

    <include layout="@layout/titlebar"/>

    <TextView android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:text="@string/hello"
              android:padding="10dp" />
    ...
</LinearLayout>

אפשר גם לשנות את כל הפרמטרים של הפריסה, כל android:layout_*. של תצוגת השורש של הפריסה הכלולה, על ידי ציון תג <include>. אפשר לראות זאת בדוגמה הבאה:

<include android:id="@+id/news_title"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         layout="@layout/title"/>

אבל, אם רוצים לשנות את מאפייני הפריסה באמצעות התג <include>, גם לשנות את android:layout_height ואת android:layout_width כדי להפוך את מאפייני פריסה אחרים ייכנסו לתוקף.

שימוש במאפיין <Merge> תג

התג <merge> עוזר להסיר קבוצות צפיות מיותרות בהיררכיית התצוגות כאשר כוללים פריסה אחת בתוך פריסה אחרת. תרחיש לדוגמה אחד של <merge> הוא כאשר להטמיע תצוגה מותאמת אישית על ידי הרחבה של ViewGroup.

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

במקום זאת, אפשר להרחיב LinearLayout כדי ליצור תצוגה מותאמת אישית ולהשתמש ב-XML של פריסה. כדי לתאר את צפיות הצאצא שלו. התג העליון ב-XML הוא <merge>, במקום LinearLayout, כמו בדוגמה הבאה:

<merge xmlns:android="http://schemas.android.com/apk/res/android">

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

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

</merge>

כשכוללים את הפריסה הזו בפריסה אחרת – באמצעות <include> תג - המערכת מתעלמת מהאלמנט <merge> ומציבה את שני הלחצנים ישירות בפריסה, במקום התג <include>.

מידע נוסף על <include> זמין במאמר משאב פריסה.