web-dev-qa-db-ja.com

onclickリスナーを削除する

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

したがって、TextView mTitleViewがあり、このようなイベントを割り当てています。

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

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

171
Josh

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

より良い設計としては、OnClickListenerでステータスのチェックを行い、クリックがクリックリスナーを追加およびクリアすることに対して何かを行うべきかどうかを判断することです。

384
Robby Pond

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

123
FreewheelNat

おそらくsetOnClickListener(null)

11
Luther

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

また、誰かが、この後にView.hasOnClickListeners()を呼び出すとtrueNO my friendが返されるとコメントしました。

Android.view.Viewクラスから取得したhasOnClickListeners()の実装を次に示します

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

ああ、助かった。 nullをチェックします。

すべてが安全です。楽しい :-)

8
Azim Ansari

ただ置いて、それは私のために働いた

itemView.setOnClickListener(null);
2
saigopi

上記の答えは不安定で信頼性が低いようです。シンプルな相対レイアウトのImageViewでこれを実行しようとしましたが、onClickイベントは無効になりませんでした。

私のために働いたのはsetEnabledを使用していたことです。

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

次に、次の方法でビューが有効になっているかどうかを確認できます。

boolean ImageView.isEnabled();

別のオプションは、setContentDescription(String string)およびString getContentDescription()を使用してビューのステータスを決定することです。

2
    /**
 * Remove an onclick listener
 *
 * @param view
 * @author [email protected]
 * @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();
        }

    }
}
2
androidmalin

以下のようにアイテムを再初期化するだけでうまくいきます。アイテムに基づいて、onclick、onlonglick、onitemclick、onitemlongclickを削除します。

mTitleView = findViewById(R.id.mTitleView);

0
Rockit Rockit