wake-up-neo.com

Entfernen Sie einen Onclick-Listener

Ich habe ein Objekt, in dem der Text durchläuft und Statusmeldungen anzeigt. Wenn sich die Nachrichten ändern, möchte ich, dass das Klickereignis des Objekts geändert wird, um Sie zu der Aktivität zu führen, auf die sich die Nachricht bezieht.

Ich habe also einen TextView mTitleView und ordne das Ereignis so zu.

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

Wie entferne ich das Klickereignis? Es gibt Statusmeldungen, die keinen Aktionsbereich enthalten. Ich möchte das Klickereignis daher deaktivieren. Ich möchte auch in der Lage sein, diese Klickereignisse durchzugehen und sie ordnungsgemäß zu entsorgen, aber ich bin nicht sicher, welche bewährten Methoden sie haben.

166
Josh

mTitleView.setOnClickListener(null) sollte den Trick tun.

Ein besserer Entwurf könnte darin bestehen, den Status im OnClickListener zu überprüfen und dann zu bestimmen, ob der Klick etwas tun soll oder nicht, indem er Klicklistener hinzufügt und löscht.

374
Robby Pond

Wenn eine Ansicht nicht anklickbar ist (z. B. eine Textansicht), bedeutet die Einstellung setOnClickListener(null), dass die Ansicht anklickbar ist. Verwenden Sie mMyView.setClickable(false), wenn Ihre Ansicht nicht anklickbar sein soll. Wenn Sie beispielsweise eine xml-Zeichnung für den Hintergrund verwenden, die unterschiedliche Farben für verschiedene Status anzeigt, können Sie, wenn Ihre Ansicht noch anklickbar ist, auf die Farbe klicken und die andere Hintergrundfarbe wird angezeigt, was seltsam aussehen kann. 

116
FreewheelNat

Vielleicht setOnClickListener(null)

11
Luther

Die Einstellung von setOnClickListener(null) ist eine gute Idee, um den Click-Listener zur Laufzeit zu entfernen. 

Und jemand kommentierte, dass der Aufruf von View.hasOnClickListeners() danach true,NOmy friend zurückgibt. 

Hier ist die Implementierung von hasOnClickListeners() aus der Android.view.View-Klasse

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

Gott sei Dank. Es wird nach null gesucht. 

Also ist alles sicher. Genießen :-)

8
Azim Ansari

Einfach gesagt, es hat für mich funktioniert

itemView.setOnClickListener(null);
2
saigopi

Die obigen Antworten wirken flüchtig und unzuverlässig. Ich habe versucht, dies mit einer ImageView in einem einfachen relativen Layout zu tun, und das onClick-Ereignis wurde nicht deaktiviert.

Was für mich funktioniert hat, war setEnabled.

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

Sie können dann prüfen, ob die Ansicht aktiviert ist mit:

boolean ImageView.isEnabled();

Eine andere Option besteht darin, setContentDescription (String string) und String getContentDescription () zu verwenden, um den Status einer Ansicht zu ermitteln.

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

Das reinitialisieren des Elements wie unten wäre der Trick. Es würde Onclick, Onlonglick, Onitemclick, OnitemLongclick basierend auf dem Element entfernen

mTitleView = findViewById (R.id.mTitleView);

0
Rockit Rockit