إعادة استخدام التنسيقات باستخدام <include>

تجربة ميزة "الكتابة"
‫Jetpack Compose هي مجموعة أدوات واجهة المستخدم المُقترَحة لنظام التشغيل Android. تعرَّف على كيفية العمل مع التنسيقات في ميزة "الإنشاء".

على الرغم من أنّ 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>، اطّلِع على مورد التنسيق.