티스토리 뷰
public class Test extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView( R.layout.myTest );
final TextView outText = (TextView)findViewById(R.id.textView01);
LinearLayout linear = (LinearLayout)findViewById(R.id.linear01);
linear.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_DOWN){
outText.setText("Touch");
return true;
}
return false;
}
});
}
}
자. 위에 소스를 보자.
outText 는 Activity의 member도 아니고 onTouch의 지역변수도 아니고
onCreate의 지역변수로 선언되어있다. Handler는 자신을 등록하는 외부메서드의
지역변수를 참조해야 하는데, 이때 외부 지역 변수에 final 지정자를 반드시 붙여야한다.
final 지정자를 붙이지 않으면 아래와 같은 오류를 배터낸다.
Cannot refer to a non-final variable outText inside an inner class defined in a different method
outText 변수는 onCreate 가 리턴되면 사라지는 지역 변수이다.
반면, onTouch메서드는 TouchListener로 등록되며 onCreate가
리턴된 후에라도 이벤트가 발생하면 언제든지 호출 될 수있다.
onTouch가 호출되었을때 outText 변수가 존재하지 않으므로,
outText의 실제값을 참조 할 수가 없는 것이다.
final을 붙이게되면 그 값은 더 이상 변경할 수 없는 상수가 되므로
onTouch를 등록하는 시점에 그 값을 분명히 전달 할 수있다.
onTouch메서드에서 참조하는 outText는 Listener가 등록될
시점의 값을 가지는 상수 객체이다.
outText 변수와 onTouch Listener 는 생성 시점과 등록시점은 같지만
존재 기간은 서로 다르다.
outText는 일개 지역변수이지만 outTouch 는 Listener로 등록되므로
사실상 전역적으로 지속된다.
한마디로,
Listener로 전달하고 싶은 지역변수는 final 로 처리해야 한다는 말이다.
[작성자] devbible.tistory.com
[참고문헌] 한빛미디어, 안드로이드프로그래밍정복, 김상형저
'Development' 카테고리의 다른 글
[Android] AsyncTask 를 이용해 backgroundThread 통한 UI 접근하기 (0) | 2010.07.26 |
---|---|
[Android] 그라데이션이 포함된 이미지의 깨짐방지 (2) | 2010.07.26 |
[Android] Effect (오디오모드) 벨모드, 진동모드, 무음모드시 동작처리 (2) | 2010.07.23 |
[Android] AVD 단축키 (0) | 2010.07.23 |
[Android] 버튼 클릭범위 (Click the range of Button) (0) | 2010.07.21 |
- Total
- Today
- Yesterday