클릭 리스너 제거


195

텍스트가 순환하고 상태 메시지를 표시하는 객체가 있습니다. 메시지가 변경되면 객체의 클릭 이벤트가 변경되어 메시지와 관련된 활동으로 이동합니다.

그래서, 나는 이것을 가지고 TextView mTitleView이벤트를 할당하고 있습니다.

public void setOnTitleClickListener(OnClickListener listener) {
    mTitleView.setOnClickListener(listener);
}

클릭 이벤트를 어떻게 제거합니까? 실행 가능한 영역이없는 일부 상태 메시지가 있으므로 클릭 이벤트를 끄고 싶습니다. 또한 이러한 클릭 이벤트를 순환하여 올바르게 처리하고 싶지만 모범 사례가 확실하지 않습니다.

답변:


419

mTitleView.setOnClickListener(null) 트릭을해야합니다.

더 나은 디자인은 OnClickListener에서 상태를 확인한 다음 클릭 리스너를 추가하고 삭제하는 것보다 클릭이 무엇을해야하는지 여부를 결정하는 것입니다.


1
이벤트 등록을 취소하기 위해해야 ​​할 다른 정리 작업이 없습니까?
Josh

2
아니. 리스너는 클릭 할 때 뷰를 사용하여 메소드를 호출하는 데 사용되는 객체이므로 null로 설정하면 소멸됩니다.
로비 연못

15
리스너가 메모리 할당을 유발하는지 궁금합니다. 우리는 그것들을 풀어야합니까? 앱 성능이 향상됩니까?
alicanbatur

2
답장을 보내 주셔서 감사합니다. 청취자의 상태 또는 플래그 확인이 더 좋다고 생각하는 이유를 추가하십시오.
kapv89

2
당신이 말할 때 a better design성능에 미치는 영향을 의미하거나 당신은 그냥 약간의 불쾌감의 말을?
RTF

132

보기를 클릭 할 수없는 경우 (예 : TextView) 설정 setOnClickListener(null)하면보기를 클릭 할 수 있음을 의미합니다. mMyView.setClickable(false)보기를 클릭 할 수 없게 하려면 사용하십시오 . 예를 들어, 배경에 대해 XML 드로어 블을 사용하는 경우 (상태에 따라 다른 색상이 표시됨)보기를 여전히 클릭 할 수 있으면 사용자가 클릭 할 수 있고 다른 배경색이 표시되어 이상하게 보일 수 있습니다.


이것은 TextView 및 기타에 대해 잘 알고 있지만 ListView의 경우 OnClickListener가 이전에 설정된 경우에는 효과가 없습니다.
누군가 어딘가에

4
이것이 바로 "보기를 클릭 할 수없는 경우 (예 : TextView)"라고 쓴 이유입니다.-ListView를 클릭 할 수있어 작동하지 않습니다.
FreewheelNat

View의 onClickListener를 비활성화 / 활성화하기 위해 앞뒤로 전환 해야하는 경우 setOnClickListener (null)를 설정하는 것보다 더 나은 솔루션입니다.
Panini Luncher

1
view.setClickable (false)과 함께 view.setOnClickListener (null)가 정답입니다.
Petros Mastrantonas

12

아마도 setOnClickListener(null)?


1
이것은 특별히 체크 박스에서는 작동하지 않으며 다른 위젯에서도 작동하지 않을 수 있습니다.
Chris

8

설정은 setOnClickListener(null)런타임에 클릭 리스너를 제거하는 좋은 아이디어이다.

또한 누군가가 전화 댓글을 달았없는 View.hasOnClickListeners()이 후 것은 반환 true, NO 내 친구.

다음은 클래스 hasOnClickListeners()에서 가져온 구현입니다.android.view.View

 public boolean hasOnClickListeners() {
        ListenerInfo li = mListenerInfo;
        return (li != null && li.mOnClickListener != null);
    }

하나님 감사합니다. 확인합니다 null.

모든 것이 안전합니다. 즐겨 :-)


4

위의 답변은 날고 신뢰할 수없는 것 같습니다. 간단한 상대 레이아웃의 ImageView 로이 작업을 시도했지만 onClick 이벤트를 비활성화하지 않았습니다.

나를 위해 일한 것은 setEnabled를 사용하고있었습니다.

ImageView v = (ImageView)findViewByID(R.id.layoutV);
v.setEnabled(false);

그런 다음 다음을 사용하여보기가 활성화되어 있는지 확인할 수 있습니다.

boolean ImageView.isEnabled();

또 다른 옵션은 setContentDescription (String string) 및 String getContentDescription ()을 사용하여보기의 상태를 판별하는 것입니다.



3
    /**
 * Remove an onclick listener
 *
 * @param view
 * @author malin.myemail@gmail.com
 * @website https://github.com/androidmalin
 * @data 2016-05-16
 */
public static void unBingListener(View view) {
    if (view != null) {
        try {
            if (view.hasOnClickListeners()) {
                view.setOnClickListener(null);

            }

            if (view.getOnFocusChangeListener() != null) {
                view.setOnFocusChangeListener(null);

            }

            if (view instanceof ViewGroup && !(view instanceof AdapterView)) {
                ViewGroup viewGroup = (ViewGroup) view;
                int viewGroupChildCount = viewGroup.getChildCount();
                for (int i = 0; i < viewGroupChildCount; i++) {
                    unBingListener(viewGroup.getChildAt(i));
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

0

아래처럼 항목을 다시 초기화하면 트릭이 수행됩니다. 항목에 따라 onclick, onlonglick, onitemclick, onitemlongclick을 제거합니다.

mTitleView = findViewById (R.id.mTitleView);

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.