onclickリスナーを削除する


194

テキストが循環してステータスメッセージを表示するオブジェクトがあります。メッセージが変更されたときに、オブジェクトのクリックイベントを変更して、メッセージが関連付けられているアクティビティに移動できるようにします。

それで、私はを持っています、TextView mTitleViewそして私はこのようなイベントを割り当てています。

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

そのクリックイベントを削除するにはどうすればよいですか?対処可能な領域がないステータスメッセージがいくつかあるため、クリックイベントをオフにしたいと思います。また、これらのクリックイベントを循環させて適切に破棄できるようにしたいのですが、ベストプラクティスがわかりません。

回答:


416

mTitleView.setOnClickListener(null) トリックを行う必要があります。

より良い設計は、OnClickListenerでステータスのチェックを行い、クリックリスナーが追加またはクリアするのではなく、クリックで何かを行うかどうかを決定することです。


1
イベントの登録を解除するために実行する必要がある他のクリーンアップはありませんか?
ジョシュ

2
いいえ。リスナーは、クリックしたときにビューがメソッドを呼び出すために使用するオブジェクトにすぎないため、nullに設定すると破棄されます。
Robby Pond

15
リスナーがメモリ割り当てを引き起こすのだろうか?それらを解放する必要がありますか?アプリのパフォーマンスは向上しますか?
alicanbatur 2013年

1
回答ありがとうございます。リスナーのステータスまたはフラグをチェックする方が良いと思う理由を追加してください。
kapv89

2
あなたが言うときにa better designは、パフォーマンスへの影響を暗示しているか、あなたはちょうどそれが少し不快だと言っていますか?
RTF 2016年

132

ビューがクリック不可(TextViewなど)の場合、設定setOnClickListener(null)はビューがクリック可能であることを意味します。mMyView.setClickable(false)ビューをクリック可能にしたくない場合に使用します。たとえば、背景にxmlドローアブルを使用すると、さまざまな状態でさまざまな色が表示されますが、ビューがまだクリック可能な場合は、ユーザーがクリックすると、さまざまな背景色が表示され、奇妙に見える場合があります。


これは、TextViewの場合などに知っておくと役立ちますが、ListViewの場合、OnClickListenerが以前に設定されている場合は効果がありません。
誰かどこか

4
これが、「ビューがクリックできない場合(TextViewなど)の場合に注意してください」と書いた理由です。ListViewはクリック可能であり、そのため機能しません。
FreewheelNat 2013

ビューのonClickListenerを無効または有効にするために前後に切り替える必要がある場合、私の意見では、これはsetOnClickListener(null)を設定するよりも優れたソリューションです。
パニーニランチャー、2014年

1
view.setOnClickListener(null)とview.setClickable(false)が正解です、ありがとう!!!!
Petros Mastrantonas

12

たぶんsetOnClickListener(null)


1
これは特にチェックボックスでは機能せず、他のウィジェットでも機能しない可能性があります。
Chris

8

設定setOnClickListener(null)は、実行時にクリックリスナーを削除することをお勧めします。

そして、誰かがView.hasOnClickListeners()この後の電話は戻ってくるとコメントしましたtrueいいえ私の友人。

これは、クラス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()を使用してビューのステータスを決定することです。


4

一言で言えば、それは私のために働いています

itemView.setOnClickListener(null);

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.