Android 입문자를 위한 Tutorial - 6. 커스텀 위젯

Mobile Programming/Android 2010. 11. 9. 14:46

위젯을 사용자가 정의하고 이를 사용한다.

package geng.mm.jnu;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.AttributeSet;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;



public class ch9 extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
}

class Editlength extends LinearLayout implements TextWatcher{
	
	EditText mEdit;
	TextView mText;
	
	public Editlength(Context context) {
  	  
		super(context);
		init();
	}
	public Editlength(Context context,AttributeSet attrs) {
	  	  
		super(context,attrs);
		init();
	}
			
	void init() {
  	
		setOrientation(LinearLayout.VERTICAL);
		mEdit = new EditText(getContext());
		mText = new TextView(getContext());
		mText.setText("Now Length : 0 Char");
		
		LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
				LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
		
		addView(mEdit,params);
		addView(mText,params);
		mEdit.addTextChangedListener(this);
	}
	
	@Override
	public void afterTextChanged(Editable arg0) {
		// TODO Auto-generated method stub
		
	}
	@Override
	public void beforeTextChanged(CharSequence s, int start, int count,
			int after) {
		// TODO Auto-generated method stub
		
	}
	@Override
	public void onTextChanged(CharSequence s, int start, int before, int count) {
		// TODO Auto-generated method stub
		mText.setText("Now Length : " + s.length() + "Characters");
	}
}

class EditEcho extends LinearLayout implements TextWatcher{

	EditText mEdit;
	TextView mText;
	
	public EditEcho(Context context) {
		super(context);
		// TODO Auto-generated constructor stub
		init();
	}
	
	public EditEcho(Context context,AttributeSet attrs) {
	  	  
		super(context,attrs);
		init();
	}

	void init() {
	  	
		setOrientation(LinearLayout.VERTICAL);
		mEdit = new EditText(getContext());
		mText = new TextView(getContext());
		mText.setText("Now Length : 0 Char");
		
		LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
				LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
		
		addView(mEdit,params);
		addView(mText,params);
		mEdit.addTextChangedListener(this);
	}

	@Override
	public void afterTextChanged(Editable s) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void beforeTextChanged(CharSequence s, int start, int count,
			int after) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void onTextChanged(CharSequence s, int start, int before, int count) {
		// TODO Auto-generated method stub
		mText.setText("Now Length : " + s + "Characters");
	}
	
}

 

외부 클래스로 만들고자 하는 위젯을 만들어야 한다.
본 예제에서의 위젯은 리니어 레이아웃을 기반으로한 텍스트뷰 위젯이므로 먼저 linearlayout을 상속하고, 위젯이 사용해야하는 두 생성자를 사용, 그리고 초기화 함수를 호출하여 위젯을 구성한다.
 두 리니어 레이아웃 모두 텍스트 에디트 + 텍스트뷰이기 때문에 init함수에서 에디트와 텍스트뷰를 add하고 있다.
Text뷰의 변화 감지를위해 addTextChangedLister를 호출하고,
역시 implements 되어있기 때문에 현재 클래스에서 찾을 수 있도록 (this)를 넘겨주었다.