Custom Layouts

 

سنشرح في هذا الدرس عن كيفية إنشاء Layout مخصص في الأندرويد.
ماذا تفيدنا الCustom Layout ؟

اذا أردت أن تضع View ما في تطبيقك وتريد أن تستخدمه في أكثر من Activity على سبيل المثال , وتريد أن تكون تخصيصات هذه View ثابتة في كل Activities.
أو أن تقوم بإنشاء ميثود ما داخل هذه Layout وتضع بعض الأمور التي تريد تنفيذها داخل هذه Layout  التي قد لا يتيحها لك  Android Framework.

سنقوم في هذا الدرس بعمل Custom ProgressBar

سنقوم بعمل ProgressBar  ونضع داخله ImageButton  عبارة عن زر “X”  ,فعندما يكون لديك عملية رفع او تحميل للملفات فإنه يظهرالProgressBar وداخله زر الإلغاء ,وعند الضغط على هذه الLayout  أو الزر سيتم إيقاف عملية الرفع أو التحميل.

قد يقول البعض أنه يمكنك فعل هذا عن طريق وضع FrameLayout وداخله PorgressBar  و زر في XML ثم تعريفهم في الجافا والخ.. , ولكن اذا اردنا استخدام هذه Custom Layout بأكثر من 8 ملفات XML!,فإذا أردت استخدام هذه الطريقة التقليدية فيجب عليك نسخ نفس الLayout  مرارً وتكراراً ناهيك عن تعريفها في Java والخ..

لهذا سنقوم بإنشاء  FrameLayoutمخصصة ونضع داخلها ProgressBar  و زر الإلغاء “X

نبدأ بإنشاء كلاس سنسميه ProgressBarWithCancel ونجعله extends FrameLayout ,ستجد أن Android Studio يظهر لك خط أحمر وأنه يجب عليك عمل إنشاء Constuctors  الخاصة ب FrameLayout

وهذه Constructors يجب عليك إنشاءها عندما تقوم بعمل extends لأي View.

نقوم بإنشاءها بهذا الشكل

نلاحظ أنه يتم عمل 3 Constructors الأولى تستدعى اذا قمت باستدعاء هذه Layout برمجياً بدون استخدام XML  بهذا الشكل

 

;(ProgressBarWithCancel frameLayout = new ProgressBarWithCancel(this

 

الآن سننشئ ميثود نسميها init  داخل نفس الكلاس وهي التي تستدعى عندما يتم إنشاء Layout ,وداخل هذه الميثود سنقوم بوضع ال ProgressBar و ImageButton

ثم نقوم بتعريف LayoutParams وهي التي تحدد حجم ومكان View وجعلنا الطول والعرض WRAP_CONTENT و Gravity Center ثم وضعنا هذه الparams ل progressBar ونفس الأمر نطبقه على ImageButton بالإضافة الى ازالة Background ووضع أيقونة الزر

ولاحظ أننا استخدمنا نفس params لأننا نريد الزر أيضاً أن يكون WRAP_CONTENT وأن يكون في المنتصف

;(ProgressBar progressBar = new ProgressBar(context
;(LayoutParams params = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT
;params.gravity = Gravity.CENTER
;(progressBar.setLayoutParams(params
;(ImageButton imageButton = new ImageButton(context
;(imageButton.setLayoutParams(params
;(imageButton.setBackground(null
;(imageButton.setImageResource(R.drawable.ic_clear
;(addView(progressBar
;(addView(imageButton

ويكون استعاء هذه ال progress Bar بهذه الطريقة في ملف xml

com.devlomi.customlayouts.ProgressBarWithCancel>
“android:layout_width=”wrap_content
</”android:layout_height=”wrap_content

 

كما نرى فيكون اسم الLayout عبارة عن اسم Package + اسم الكلاس ( يمكنك فقط كتابة اسم الكلاس و Android Studio سيظهر كامل الإسم )

نشغيل التطبيق وسنجده بهذا الشكل :