[android] View의 setClickable() 과 setOnClickListener() 의 관계
android 2013. 3. 25. 21:25작성일 : 2013-03-25
작성자 : hanburn
오늘 이상한 삽질하다가 발견한 것
setClickable(false)을 호출해도 clickable 하게 동작하는 경우가 발생하였다. 바로 문제의 code
if( 특정조건시 ) {
somTextView.setText(“클릭불가”);
somTextView.setClickable(false);
somTextView.setOnClickListener(null);
} else {
somTextView.setClickable(true);
somTextView.setText(“클릭가능”);
somTextView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
doAction();
}
});
}
위의 코드처럼 만들어서 분명히 setClickable을 false로 하였는데도 click 가능한 상태로 동작하는 것이다. 이상해서 View클래스의 setOnClickListener 코드를 살펴봤다.
[View.class의 setOnClickListener]
public void setOnClickListener(OnClickListener l) {
if (!isClickable()) {
setClickable(true);
}
mOnClickListener = l;
}
역시나 이 코드에서 내부적으로 clickable인지 체크해서 아니면 setClickable(true)를 호출해주고 있다. 그래서 setClickable을 호출을 setOnClickListener 다음에 호출하도록 순서만 변경하니 잘 동작한다.
if( 특정조건시 ) {
somTextView.setText(“클릭불가”);
somTextView.setOnClickListener(null);
somTextView.setClickable(false);
} else {
somTextView.setClickable(true);
somTextView.setText(“클릭가능”);
somTextView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
doAction();
}
});
}
위의 경우에서 setOnClickListener(null)을 호출 안하면 문제가 발생하지 않기는 하는데, Adapter의 getView에서 전형적으로 사용하는 ViewHolder 패턴을 사용하다 보니 꼭 호출해야 되었습니다.