اگر می‌خواید یک ویجت یکپارچه و تروتمیز بسازید که جاهای مختلف ازش استفاده کنید، بهترین راه ساختن یک ویجت اختصاصی برای خودتونه، چیزی که بتونید بدون کپی پیست کردن کدهای قبلی و تنها با با فراخوانی و تعریف اون براحتی ازش استفاده کنید. مثلا در مورد خود من، من می‌خواستم ویجتی داشته باشم که هم نقش دکمه رو برای من ایفا بکنه و هم اینکه یک لودینگ برای من باشه، به همین منظور اومدم و یک کلاس (ویجت) اختصاصی برای خودم ساختم و هرجا نیاز داشتم از این ویجت استفاده کرده و دیگه خبری از کپی پیست نبود.
اول ببینیم ویجتی که من می‌خواستم داشته باشم چه‌شکلی بود؟

```
    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/lbimage_icon"
        android:src="@drawable/ic_done_white_24dp"
        android:layout_centerVertical="true"
        android:layout_toStartOf="@+id/lbtext_title"
        android:layout_toLeftOf="@+id/lbtext_title" />
        
    <android.support.v4.widget.ContentLoadingProgressBar
        android:id="@+id/lbloading_indicator"
        style="?android:attr/progressBarStyle"
        android:background="@color/btn_green"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:visibility="gone"
        android:layout_gravity="center_horizontal"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true" />
</RelativeLayout>
```

همونطور که می‌بینید این ویجت یگ آیکون، یک متن و یک پراگرس‌بار داره که قراره نقش یک دکمه رو عمل بکنه و در مواقع نیاز به شکل یک لودینگ در بیاد. گام بعدی برای ایجاد ویجت خودمون ساختن یک کلاس و لود کردم این `layout` درون اونه.

``` package ir.farnabaz; public class LoaderButton extends RelativeLayout implements View.OnClickListener {

TextView textView;
ImageView actionIcon;
ContentLoadingProgressBar progress;
OnClickListener clickListener;

public LoaderButton(Context context) {
super(context);
init(null);
}

public LoaderButton(Context context, AttributeSet attrs) {
super(context, attrs);
init(attrs);
}

public LoaderButton(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(attrs);
}

public LoaderButton(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
init(attrs);
}

public void setText(String text) {
textView.setText(text);
}

public void setLoading(boolean loading) {
if (loading) {
progress.setVisibility(VISIBLE);
} else {
progress.setVisibility(GONE);
}
}

public void setIcon(Drawable icon) {
actionIcon.setImageDrawable(icon);
}

public boolean isLoading() {
return progress.getVisibility() == VISIBLE;
}

@Override
public void setOnClickListener(OnClickListener l) {
this.clickListener = l;
}

@Override
public void onClick(View view) {
if (!isLoading() && clickListener != null) {
clickListener.onClick(view);
}
}

private void init(AttributeSet attrs) {
inflate(getContext(), R.layout.layout_loader_button, this);
textView = (TextView) findViewById(R.id.lbtext_title);
actionIcon = (ImageView) findViewById(R.id.lbimageView);
progress = (ContentLoadingProgressBar) findViewById(R.id.lbloading_indicator);

  super.setOnClickListener(this);

}
}

<p>مهمترین بخش این کلاس تابع `init` هست که فایل `xml` مارو لود میکنه و می‌کنه و قراره تنظیمات لازم رو هم انجام بده برای ما. بقیه توابع هم بسته به نیاز ساخته شده‌اند تا بشه راحت با ویجت کار کرد، مثلا `setIcon` برای اینکه بشه آیکون دکمه رو عوض کنیم.<br>تا همینجا هم کار تمومه و ما الان یک ویجت برای خودمون داریم، کافیِ تو فایل دیزاین خودمون از اون استفاده کنیم</p>

<ir.farnabaz.LoaderButton
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="@color/btn_green"
android:layout_alignParentBottom="true"
android:id="@+id/btn_submit"
android:layout_alignParentLeft="true">
</ir.farnabaz.LoaderButton>

<p>ولی اگه بخوایم توی فایل `xml` دیزاین خودمون متن یا آیکون دکمه رو عوض کنیم داستان چجوری میشه؟ خب این کار تو اندروید کمی مسخره است، یعنی از دید من مسخره است، چون باید اول تعریف کنیم که ویجت ما میتونه ویژگی‌های خاصی داشته باشه و بعد توی کلاس خودمون اون ویژگی‌ها (همون آیکون و متن دکمه) رو بخونیم و استفاده کنیم.<br>برای تعریف ویژگی‌ها فایلی به نام `attrs.xml` توی فولدر `values` بسازید و کد زیر رو درونش قرار بدید.</p>
```

فایل بالا مشخص میکنه که ویجت ما میتونه دوتا ویژگی `android:text` و `android:icon` رو داشته باشه. جالا برگردیم سراغ کلاس خودمون و توی تابع `init` این تیکه کد رو اضافه کنیم تا همه چی به خیر و خوشی تموم بشه :)

``` if (attrs != null) { TypedArray a = getContext().obtainStyledAttributes( attrs, R.styleable.LoaderButton);
textView.setText(a.getString(R.styleable.LoaderButton_android_text));
actionIcon.setImageDrawable(a.getDrawable(R.styleable.LoaderButton_android_icon));

}