سلام دوستان عزیز ف امیدوارم که حال شما خوب باشه و از اموزشهای ما رضایت کامل داشته باشید. در این بخش میپردازیم به ادامه مباحث در زمینه اندروید.
اندروید لیست بزرگی از ویجت های از پیش ساخته شده مانند Button، TextView، EditText، ListView، CheckBox، RadioButton، Gallery، Spinner، AutoCompleteTextView و غیره را ارائه می کند،که شما میتوانید مستقیما در اپلیکیشن اندرویدی خود از آنها استفاده کنید. ولی ممکن است موقعیتی به وجود بیاید که شما از قابلیت های ویجت های موجود راضی نباشید. اندروید ابزارهایی را برای ایجاد مولفه های سفارشی شما فراهم کرده است که با کمک آنها شما می توانید با توجه به نیاز خود عمل سفارشی سازی را انجام دهید.

اگر شما فقط نیازمند اعمال تغییرات و تنظیمات کوچکی در یک ویجت یا Layout موجود باشید، می توانید به سادگی یک زیر کلاس از ویجت یا Layout مربوطه ایجاد کنید و متدهای آن را override کنید. این کار به شما کنترل دقیقی را بر روی ظاهر و عملکرد یک عنصر موجود بر روی صفحه نمایش می دهد .

این خودآموز با استفاده از گام ها و مراحل ساده شرح میدهد که شما چگونه می توانید view های سفارشی خود را ایجاد کنید و از آنها در اپلیکیشن خود استفاده کنید.
ایجاد یک مولفه سفارشی ساده

در صورتی که شما بخواهید عملکرد یک ویجت موجود مانند Button، TextView، EditText، ListView، CheckBox و غیره را توسعه دهید، ساده ترین راه برای ایجاد مولفه­ی سفارشی مربوط به خودتان، توسعه کلاس مربوط به ویجت موجود یا زیر کلاس های مربوط به کلاس خودتان است. در غیر این صورت شما باید با شروع از کلاس android.view.View همه کارها را خودتان انجام دهید.

در ساده ترین شکل، شما باید سازنده (constructors) های خود را متناظر با همه سازنده های کلاس اصلی بنویسید. برای مثال اگر شما بخواهید TextView را برای ساخت یک DateView توسعه دهید، آنگاه سه سازنده­ی زیر برای کلاس DateView ایجاد می شود.
?
۱
۲
۳
۴
۵
۶
۷
۸
۹
۱۰
۱۱
۱۲
۱۳
۱۴
۱۵
۱۶

pubic class dataview extends textveiw {
public dataview(context context){
super(context);
//— additional custom code —

}
public dataview(context context,attributeset attrs)
super(context,attrs);
//— additional custom code —
}
public dataview(context context ,attributeset attrs, int defstyle) {
super(context,attrs,defstyle);
//— additional custom code —
}
}
}

از آنجایی که شما DateView را به عنوان فرزند TextView ایجاد کردید، این کلاس به تمام ویژگی ها، متدها و رویدادهای مربوط به TextView دسترسی خواهد داشت و شما می توانید بدون نیاز به هیچگونه پیاده سازی بیشتری از آنها استفاده کنید. همان طور که در مثال های زیر شرح داده شده است، شما عملکردها و قابلیت های سفارشی اضافی را در داخل کد خود پیاده سازی می کنید.

در صورتی که شما نیازمند پیاده سازی سفارشی ترسیم/سایزبندی ویجت های سفارشی خود باشید، باید متدهای onMeasure (intwidthMeasureSpec, intheightMeasureSpec)و onDraw(Canvas canvas) را override کنید. اگر شما نمی خواهید که مولفه های از پیش ساخته شده موجود را مجددا سایز بندی کنید یا آنها را تعییر شکل دهید، به هیچ کدام از این متدها در مولفه سفارشی خود نیاز ندارید.

متد onMeasure() برای گزارش طول و عرض ویجت با مدیر صفحه بندی (layout manager) همکاری می کند، و شما برای گزارش ابعاد، نیازمند فراخوانی setMeasuredDimension(int width, int height)از درون این متد هستید.

پس از آن شما می توانید ترسیم سفارشی مربوط به خودتان را اجرا کنید، که در آن android.graphis.Canvas کاملا شبیه به همتای خود در Swing است و دارای متدهایی مانند drawRect()، drawLine()،drawBitmap() و غیره است که شما می توانید برای ترسیم مولفه خود از آنها استفاده کنید.

زمانیکه شما یک مولفه سفارشی را با توسعه­ی یک ویجت موجود پیاده سازی می کنید، می توانید به دو طریق از این مولفه های سفارشی در توسعه اپلیکیشن خود نمونه سازی کنید.
نمونه سازی با استفاده از کدهای موجود در کلاس Activity

این روش نمونه سازی مولفه سفارشی بسیار شبیه به روش نمونه سازی ویجت های موجود در کلاس activity شماست. برای مثال شما می توانید از کد زیر برای نمونه سازی مولفه سفارشی تعریف شده در بالا استفاده کنید.
?
۱
۲
۳
۴
۵
۶
۷
۸

@verride
protected void onCreate(bundle savedInstanceState){
super.oncreate (savedInstanceState);
setContentView(R.layout.activity_main);
dateview dataveiw = new dateview(this);
setcontentView(DataVeiw);

}

این مثال را برای درک چگونگی نمونه سازی یک مولفه سفارشی اندرویدی پایه ای با استفاده از کدهای درون یک فعالیت، بررسی کنید.
نمونه سازی با استفاده از فایل صفحه بندی XML

به صورت قراردادی از فایل صفحه بندی XML برای نمونه سازی ویجت های موجود استفاده میشود. همین مفهوم در مورد ویجت های سفارشی شما نیز وجود دارد و شما می توانید همانطور که در ادامه شرح داده میشود، مولفه سفارشی خود را با استفاده از فایل صفحه بندی نمونه سازی کنید. در اینجا com.example.dateviewdemo پکیجی است که شما تمام کد مربوط به کلاس DateView را در آن قرار داده اید و DateView یک نام کلاس جاواست که شما منطق کامل مولفه سفارشی خود را در آن قرار داده اید.
?
۱
۲
۳
۴
۵

توجه به این نکته مهم است که ما از تمام ویژگی های TextView همراه با مولفه­ی سفارشی بدون هیچ تغییری استفاده می کنیم. به صورت مشابه شما می توانید از تمام رویدادها و متدهای مربوط به مولفه DateView استفاده کنید.

این مثال را برای درک چگونگی نمونه سازی یک مولفه سفارشی اندرویدی پایه با استفاده از فایل XML بررسی کنید.
مولفه سفارشی همراه با ویژگی های سفارشی

ما دیدیم که چگونه می توان عملکرد ویجت های موجود را گسترش داد ولی در هر دو مثال بالا، دیدیم که مولفه توسعه یافته می تواند از تمام ویژگی های پیش فرض استفاده کند. ولی موقعیتی را تصور کنید که شما می خواهید از ابتدا ویژگی ها خاص خود را ایجاد کنید. در ادامه یک رویه ساده برای ایجاد و استفاده از ویژگی های جدید برای مولفه های سفارشی اندروید ارائه شده است. توجه کنید که ما می خواهیم سه ویژگی جدید را معرفی کنیم و همان طور که در ادامه نشان داده است، از آنها استفاده می کنیم.
?
۱
۲
۳

مرحله ۱

اولین مرحله برای اینکه ما قادر باشیم از ویژگی های سفارشی استفاده کنیم، این است که آنها را در یک فایل XML جدید تحت پکیج res/values/ تعریف کنیم و آن را attrs.xml بنامیم. بیایید به یک فایل attrs.xml نمونه نگاهی بیندازیم.
?
۱
۲
۳
۴
۵
۶
۷

در این مثال، name=value چیزی است که ما می خواهیم در فایل صفحه بندی XML مان از آن استفاده کنیم و format=type نوع ویژگی است.
مرحله ۲

دومین مرحله خواندن این ویژگی ها از فایل صفحه بندی XML و تنظیم آنها برای مولفه­ی مربوطه است.این منطق در ارتباط با سازنده هاست که یک AttributeSet به آنها فرستاده می شود. AttributeSet شامل ویژگی های XML است. برای خواندن مقادیر XML، شما باید ابتدا یک TypedArray را از AttributeSet ایجاد کنید. سپس همان طور که در کد مثال زیر نشان داده شده است، از آن برای خواندن و تنظیم مقادیر استفاده کنید.
?
۱
۲
۳
۴
۵
۶
۷
۸
۹
۱۰
۱۱
۱۲
۱۳
۱۴
۱۵
۱۶
۱۷
۱۸

typedArray a = contect.obtainStyledAttributes(attrs,R.styleable.dateview);
final int N=a.getIndexCount();
For (int i=0: i< N ;++i)
{
int attr=a.getindex(i);
switch (attr)
{
case R.styleable.dataview_delimiter:
string delimiter = a.getstring(attr);
//…do something with delikiter…
breake;
case r.styleable.dataview_Fancytext:
boolean fancytext= a.getboolean(attr,false);
//…do something with fancyText…
break;
}

}
مرحله ۳

نهایتا شما می توانید به صورت زیر، از ویژگی های تعریف شده، در فایل صفحه بندی XML خود استفاده کنید.
?
۱
۲
۳

بخش مهم کد بالا

xmlns:custom=”http://tahlildadeh.com/” است. توجه کنید که http://tahlildadeh.com/ به همان صورتی که هست باقی می ماند ولی قسمت انتهایی مطابق با نام پکیج شما تنظیم میشود و همچنین شما می توانید از هر چیزی بعد از xmlns استفاده کنید. در این مثال من از custom استفاده کردم ولی شما می توانید از هر نامی که دوست دارید استفاده کنید.