안드로이드에서 제공하는 기본 레이아웃 외에 사용자가 기존 위젯을 이용해서 뷰를 생성하는 것이 가능하다. 아래의 코드는 EditText와 Button을 이용한 간단한 예제. 참고도서는 "Professional Android Application Development" 의 122 페이지
// ClearableEditText.java
// 사용자 뷰를 위한 컴포넌트 등록
package com.test;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
public class ClearableEditText extends LinearLayout {
EditText editText;
Button clearButton;
public ClearableEditText(Context context) {
super(context);
init();
}
public ClearableEditText(Context context, AttributeSet attrs){
super(context, attrs);
init();
}
private void init(){
Log.d("MyLog", "ClearableEditText constructor is called");
String infService = Context.LAYOUT_INFLATER_SERVICE;
LayoutInflater li;
li = (LayoutInflater) getContext().getSystemService(infService);
li.inflate(R.layout.clearable_edit_text, this, true);
editText = (EditText) findViewById(R.id.editText);
clearButton = (Button) findViewById(R.id.clearButton);
hookupButton();
}
private void hookupButton() {
clearButton.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
editText.setText("");
}
});
}
}
<!-- clearable_edit_text.xml -->
<!-- 사용자 뷰를 위한 위젯 배치 -->
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<EditText android:id="@+id/editText" android:layout_width="fill_parent"
android:layout_height="wrap_content"></EditText>
<Button android:id="@+id/clearButton" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:text="취소"></Button>
</LinearLayout>
<!-- main.xml -->
<!-- 사용자 뷰 출력 -->
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content" android:text="@string/hello" />
<com.test.ClearableEditText
android:id="@+id/NaviView" android:layout_width="fill_parent"
android:layout_height="wrap_content"></com.test.ClearableEditText>
</LinearLayout>
위의 코드의 경우 LinearLayout 을 상속받는데 이때 사용자 뷰를 만들때는 반드시 모든 경우의 생성자를 오버라이딩 해야 한다.