Bazen yazdığınız sayfalarında hepsinde ortak kullandığınız yapılarınız olur. Bunları çok özellikli yapılar olarak düşünmeye gerek yok aslında. Hep aynı font, vs özelliklerle gösterilecek bir Textview’den, çizdirdiğiniz bir grafiğe kadar uzabilecek bir kullanım mevcut. 

Sadece görsel olarak aynı olup içine ekstra özellikler yükleme zorunluluğunuz olmayan durumlarda kullanım en basittir. Merge tagiyle farklı bir layoutda yararttığınız layout’u, kendi sayfanızın ve diğer sayfaların xml’lerinde include ederek tekrar tekrar kullanabilirsiniz. (http://developer.android.com/training/improving-layouts/reusing-layouts.html)

reusetextview.xml

<merge xmlns:android=”http://schemas.android.com/apk/res/android”&gt;
 
    <TextView android:id=”@+id/reuse_textview”
android:layout_width=”match_parent”
android:layout_height=”wrap_content”
android:text=”TEST”/></merge>

 
mainpage.xml:
<?xml version=”1.0″ encoding=”utf-8″?>
<LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android&#8221;
android:layout_width=”match_parent”
android:layout_height=”match_parent”
android:orientation=”vertical” ><include layout=”@layout/reusetextview”/>

</LinearLayout>

Diğer taraftan include ederek kullanmak her zaman yeterli olmayabilir, bazı ek özellikler verilmesi gerekebilir ya da kullanılacak olan view daha komplex olabilir. Bu gibi durumlarda custom view’ler yazmamız gerekir.

Container olarak kullanabileceğimiz bir layoutdan extend eden view’imiz içinde reuse edeceğimiz partı xml’den inflate edebilir ya da tüm özelliklerini kendimiz kodumuzun içinde vererek dinamik olarak yaratabiliriz.

Custom layoutlarda en önemli konu ise aynı sayfada birden fazla kullanıldığında inner view’lerde aynı id’ye sahip olan view’lerin cihaz tarafından algılanırken karışıklık yaratması. Bu durum ise nextfocus, focusdown gibi attribute’ler okunurken önem kazanıyor. Normal şartlarda parent layoutları farklı olduğu için karışıklık yaşanmamakla beraber mesela yan yan koyduğunuz iki EditText’den keyboard’a basıldığında bir sonraki alana geçilmesi isteniyorsa sorun yaşanmaya başlanacaktır.Bu gibi durumlarda layout’dan inflate etmek yerine herşeyi dinamik yaratıp, inner layoutlara kodda id generate edip verme çözümü doğru olan olacaktır.

 
public class CustomLayout extends LinearLayout{public CustomLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
initView(context);
}

public CustomLayout(Context context, AttributeSet attrs) {
super(context, attrs);
initView(context);
}

public CustomLayout(Context context) {
super(context);
initView(context);
}

private void initView(Context context){
LinearLayout container = new LinearLayout(context);

//inflate your layout here.

this.addView(container);
}
}

 

id generate ederek eklemeye Örnek:

..initView(Context context){

LinearLayout container = new LinearLayout(context);

container.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));

EditTextView editTextView1 = new EditTextView(context);

editTextView1 .setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

editTextView1.setId(editText1.getHashCode());

EditTextView editTextView2 = new EditTextView(context);

editTextView2 .setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

editTextView2.setId(editText2.getHashCode());

container.addView(editTextView1);

conteiner.add(editTextView2);

this.addView(container);

}