Entfernen Sie einen Onclick-Listener

194

Ich habe ein Objekt, in dem der Text wechselt und Statusmeldungen anzeigt. Wenn sich die Nachrichten ändern, soll sich das Klickereignis des Objekts ändern, um Sie zu der Aktivität zu führen, auf die sich die Nachricht bezieht.

Also, ich habe eine TextView mTitleViewund ich ordne das Ereignis so zu.

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

Wie entferne ich dieses Klickereignis? Es gibt einige Statusmeldungen, die keinen umsetzbaren Bereich haben, daher möchte ich das Klickereignis deaktivieren. Ich möchte diese Klickereignisse auch durchlaufen und ordnungsgemäß entsorgen können, bin mir jedoch nicht sicher, welche Vorgehensweise empfohlen wird.

Josh
quelle

Antworten:

416

mTitleView.setOnClickListener(null) sollte den Trick machen.

Ein besseres Design könnte darin bestehen, den Status im OnClickListener zu überprüfen und dann zu bestimmen, ob der Klick etwas bewirken soll, anstatt Klick-Listener hinzuzufügen und zu löschen.

Robby Pond
quelle
1
Es gibt keine andere Bereinigung, die ich durchführen muss, um das Ereignis abzumelden?
Josh
2
Nee. Der Listener ist nur ein Objekt, mit dem die Ansicht eine Methode aufruft, wenn Sie darauf klicken. Wenn Sie sie auf Null setzen, wird sie zerstört.
Robby Pond
15
Ich frage mich, ob Hörer Speicherzuweisung verursachen? Müssen wir sie befreien? Steigert das die Leistung der App?
Alicanbatur
1
Vielen Dank für Ihre Antwort. Fügen Sie hinzu, warum Sie der Meinung sind, dass es besser ist, den Status oder ein Flag im Listener zu überprüfen.
Kapv89
2
Wenn Sie sagen a better design, implizieren Sie Auswirkungen auf die Leistung oder sagen Sie nur, dass es ein bisschen unangenehm ist?
RTF
132

Beachten Sie, dass wenn eine Ansicht nicht anklickbar ist (z. B. eine Textansicht), die Einstellung setOnClickListener(null)bedeutet, dass die Ansicht anklickbar ist. Verwenden mMyView.setClickable(false)Sie diese Option, wenn Ihre Ansicht nicht anklickbar sein soll. Wenn Sie beispielsweise eine für den Hintergrund zeichnbare XML-Datei verwenden, die unterschiedliche Farben für unterschiedliche Status anzeigt, können Benutzer darauf klicken, wenn Ihre Ansicht weiterhin anklickbar ist, und die unterschiedliche Hintergrundfarbe wird angezeigt, was möglicherweise seltsam aussieht.

FreilaufNat
quelle
Dies ist für TextViews und dergleichen gut zu wissen, aber für eine ListView hat dies keine Auswirkung, wenn zuvor ein OnClickListener festgelegt wurde.
Jemand irgendwo
4
Aus diesem Grund habe ich geschrieben: "Beachten Sie, dass eine ListView anklickbar ist, wenn eine Ansicht nicht anklickbar ist (z. B. eine Textansicht)". Dies funktioniert daher nicht.
FreilaufNat
Wenn wir hin und her wechseln müssen, um den onClickListener der Ansicht zu deaktivieren / aktivieren, ist dies meiner Meinung nach die bessere Lösung als setOnClickListener (null) zu setzen.
Panini Luncher
1
view.setOnClickListener (null) zusammen mit view.setClickable (false) ist die richtige Antwort, danke !!!!
Petros Mastrantonas
12

Vielleicht setOnClickListener(null)?

Luther
quelle
1
Dies funktioniert nicht speziell für Kontrollkästchen und wahrscheinlich auch nicht für andere Widgets.
Chris
8

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

Und auch jemand hat kommentiert, dass ein Anruf View.hasOnClickListeners()danach zurückkehren wird true, NEIN mein Freund.

Hier ist die Implementierung von hasOnClickListeners()aus der android.view.ViewKlasse genommen

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

Danke Gott. Es prüft auf null.

Also ist alles sicher. Genießen :-)

Azim Ansari
quelle
4

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

Was für mich funktioniert hat, war die Verwendung von setEnabled.

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

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

boolean ImageView.isEnabled();

Eine andere Option ist die Verwendung von setContentDescription (String string) und String getContentDescription (), um den Status einer Ansicht zu bestimmen.

Brandon Thompson
quelle
4

Einfach gesagt, es hat bei mir funktioniert

itemView.setOnClickListener(null);
Sai Gopi N.
quelle
3
    /**
 * 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();
        }

    }
}
Androidmalin
quelle
0

Nur das Element wie unten neu zu initialisieren, würde den Trick tun. Es würde onclick, onlonglick, onitemclick, onitemlongclick basierend auf item entfernen

mTitleView = findViewById (R.id.mTitleView);

Rockit Rockit
quelle