drcarter의 DevLog

  Android에서는 EditText 에서 입력 이벤트 처리를 해 주어야 할 경우가 있습니다. 키보드에서 입력하는 동안의 이벤트와 그리고 enter키가 눌렸을 때의 이벤트 처리 등. 해줘야 할 부분이 있습니다. EditText에 있는 OnEditorActionListener와 OnKeyListener를 이용해서 하게 되면 Enter와 back기와 같은 이벤트를 처리 할 수 있습니다. 
  OnEditorActionListener와 OnKeyListener의 결과는 비슷하기 때문에 OnEditorActionListener를 이용한 예제 코드를 보자면

package com.test.edittext;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.TextView.OnEditorActionListener;

public class EditTextEvent extends Activity implements OnEditorActionListener{
	
	EditText editInput = null;
	TextView textResult = null;
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        editInput = (EditText)findViewById(R.id.EditText_Input);
        editInput.setOnEditorActionListener(this);
    }

	@Override
	public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
		// TODO Auto-generated method stub
		switch(v.getId())
		{
		case R.id.EditText_Input:
		{
			if(event.getAction() == KeyEvent.ACTION_DOWN)
			{
				Log.i("TEST", "TEST");
			}
			break;
		}
		}
		return false;
	}
}


이런식으로 하게 되면 됩니다... 하지만
소프트 키보드에서 입력한 순간 순간마다의 이벤트는 받지 못합니다. OnKeyListener를 이용하여도 마찬가지 입니다. 이럴 때에는 addTextChangedListener 라는 것을 이용하면 됩니다. 이것에 대한 자세한 내용은
http://developer.android.com/reference/android/text/TextWatcher.html
이곳에 하면 볼 수 있습니다.
예제 코드를 작성하자면

package com.test.edittext;

import android.app.Activity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.KeyEvent;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.TextView.OnEditorActionListener;

public class EditTextEvent extends Activity implements OnEditorActionListener{
	
	EditText editInput = null;
	TextView textResult = null;
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        editInput = (EditText)findViewById(R.id.EditText_Input);
        editInput.setOnEditorActionListener(this);
        editInput.addTextChangedListener(textWatcherInput);
    }

	@Override
	public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
		// TODO Auto-generated method stub
		switch(v.getId())
		{
		case R.id.EditText_Input:
		{
			if(event.getAction() == KeyEvent.ACTION_DOWN)
			{
				Log.i("TEST", "TEST");
			}
			break;
		}
		}
		return false;
	}
	
	TextWatcher textWatcherInput = new TextWatcher() {
		
		@Override
		public void onTextChanged(CharSequence s, int start, int before, int count) {
			// TODO Auto-generated method stub
			Log.i("onTextChanged", s.toString());			
		}
		
		@Override
		public void beforeTextChanged(CharSequence s, int start, int count,
				int after) {
			// TODO Auto-generated method stub
			Log.i("beforeTextChanged", s.toString());		
		}
		
		@Override
		public void afterTextChanged(Editable s) {
			// TODO Auto-generated method stub
			Log.i("afterTextChanged", s.toString());
		}
	};	
}



  이렇게 해주면 됩니다. TextWatcher안에 있는 onTextChanged는 변경된 텍스트에 대한 결과를. beforeTextChanged는 변경되기 전에 입력 되었던 텍스트에 대한 내용을. afterTextChanged는 텍스트가 변경이 되었을 때의 결과를 보여줍니다. 처음에 TextWatcher를 몰랐던 저도 EditText에서 입력되는 순간순간마다의 변경되는 내용을 처리하기 위해서 상당히 고민을 했습니다. 머 우회적인 방법으로 변경된 내용을 확인하긴 했지만, 이렇게 쓸 수 있는 방법이 있다는 걸 알았으니 더 코딩하기가 쉬워 지는군요.

예제 코드도 첨부 합니다.