프로그래밍/Java, Android

안드로이드 뷰 캡슐화 전략 - AutoCompleteTextView

당근천국 2011. 4. 18. 11:24



안드로이드(android) 뷰 캡슐화를 통한 자동완성 택스트뷰를 만들기위한 코드입니다,
자동완성 택스트뷰같은경우 데이터바인딩만 하면 혼자 작동하기때문에 별로 어렵진 않습니다 ㅎㅎㅎ


 
1. claAutoCompleteTextView

package ViewControl;

import android.content.Context;
import android.text.Editable;
import android.text.TextWatcher;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.TextSwitcher;

/** 
* claAutoCompleteTextView
* 
* @author DangGun Roleeyas ( http://blog.danggun.net ) 
* @version 1.0 ( 2010.11.28 )
* 
* 오토 컴플리트 텍스트 뷰
*  
* 이 클래스는 그대로 사용하지 말고 복사해서 사용해야 합니다.
* 이 클래스는 뷰들의 세팅작업을 한번에 완료하고 제어하는데 목적이 있습니다.
* 
* 클래스 자체적으로 뷰객체를 저장하고 있으므로 외부에서는 이 클래스의 객체만 생성해서 사용하세요.
* GetOvject() 메소드를 통해 저장되있는 객체에 직접 접근 할수 있습니다.
* 
* 복사한후 자신이 사용하려는 동작을 할수 있게 직접 수정하셔야 합니다.
* 이 클래스의 내용은 참고용으로 사용 하시기 바랍니다.
*
* 자동완성텍스트뷰를 제어하기 위한 리스너 클래스입니다. 
* 데이터 제어는 여기서 하지 않고 데이터를 제어하기위한 인터페이스만 제공합니다.
* 
* 만약 오토 컴플리트 텍스트 뷰가 여러개이면 이 클래스도 여러개 생성해야 합니다.(일반 리스너와 동일, )
* 
*/
public class claAutoCompleteTextView extends TextSwitcher
{
    ArrayAdapterstrACAdapter;
    AutoCompleteTextView acView;

    /**
    * 생성자
    * 
    * 오토 컴플리트 텍스트 뷰에 아답터를 연결한후 제어할 리스너를 연결합니다.
    * 연결할 데이터를 미리 설정해놓는 방식은 데이터를 정적일때 사용합니다.
    * 
    * 연결할 데이터가 동적이라면 
    * 데이터를 갱신해주는 클래스를 받아서 afterTextChanged()를 호출할때마다 갱신되게 해야 합니다.
    * 
    * @param context 메인 뷰
    * @param acView 이 클래스 내에 객체가 저장되므로 객체를 따로 저장 하실 필요는 없습니다.
    * @param items[] 연결할 데이터
    */
    public claAutoCompleteTextView(Context context, AutoCompleteTextView acView, String items[]) 
    {
        super(context);

        this.acView = acView;

        //아답터 생성
        strACAdapter = new ArrayAdapter( context, android.R.layout.simple_dropdown_item_1line, items);

        //아답터 연결
        this.acView.setAdapter(strACAdapter);

        //리스너 등록
        this.acView.addTextChangedListener( twTextChanged);
    }

    //텍스트가 변경되었을때 사용할 리스너 생성
    private TextWatcher twTextChanged = new TextWatcher() 
    {

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) 
        {
            // 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 afterTextChanged(Editable s) 
        {
            // TODO Auto-generated method stub

        }
    };

    /**
    * @return 이 클래스가 소유하고 있는 객체를 리턴합니다.
    */
    public AutoCompleteTextView GetOvject()
    {
        return this.acView;
    } 
}


 
2. 사용법

claAutoCompleteTextView acTest1 
= new claAutoCompleteTextView(this, (AutoCompleteTextView)findViewById(R.id.acTest1), strData1);


 
3. 주의사항
데이터도 이 클래스에 저장하고 싶으면 생성자에서 아이탬을 클론으로 받아와야 예상하지 못한 동작을 막을수 있습니다.
AutoCompleteTextView의 자체 버그인지는 모르겠지만 처음 뷰가생성되고 아무런 값이 없을때 AutoCompleteTextView에 접근하려고하면 에러가 나는 경우가 있습니다. 이 현상을 막기위해 생성자에서 초기값이나 빈값을 지정해줄 필요가 있습니다.