'setOnClickListener'에 해당되는 글 1건

  1. 2013.03.25 [android] View의 setClickable() 과 setOnClickListener() 의 관계

[android] View의 setClickable() 과 setOnClickListener() 의 관계

android 2013. 3. 25. 21:25

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

작성일 : 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)을 호출 안하면 문제가 발생하지 않기는 하는데, AdaptergetView에서 전형적으로 사용하는 ViewHolder 패턴을 사용하다 보니 꼭 호출해야 되었습니다.

 



: