إعادة استخدام التنسيقات باستخدام <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 آخر كجذر للتنسيق القابل لإعادة الاستخدام إلى ظهور 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>، راجع مورد التنسيق.