Onclick dinleyiciyi kaldırma


195

Metin döngü ve durum mesajları görüntüler bir nesne var. İletiler değiştiğinde, nesnenin click olayının, iletinin ilişkili olduğu etkinliğe götürmek için değiştirilmesini istiyorum.

Yani, bir tane var TextView mTitleViewve olayı böyle atarım.

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

Bu tıklama etkinliğini nasıl kaldırabilirim? İşlem yapılabilir alanı olmayan bazı durum mesajları var, bu nedenle click olayını kapatmak istiyorum. Ayrıca, bu tıklama etkinliklerinde dolaşıp düzgün bir şekilde atmak istiyorum, ancak en iyi uygulamadan emin değilim.

Yanıtlar:


419

mTitleView.setOnClickListener(null) hile yapmalı.

Daha iyi bir tasarım, OnClickListener'daki durumun kontrol edilmesi ve tıklamanın tıklama dinleyicileri ekleme ve temizleme gibi bir şey yapıp yapmaması gerektiğini belirlemek olabilir.


1
Etkinliğin kaydını silmek için yapmam gereken başka bir temizleme yok mu?
Josh

2
Hayır! Dinleyici, görünümün tıklattığınızda bir yöntemi çağırmak için kullandığı bir nesnedir; bu nedenle, null değerine ayarladığınızda, onu yok eder.
Robby Pond

15
dinleyiciler bellek ayırma neden olup olmadığını merak ediyorum? Onları kurtarmamız gerekiyor mu? Bu uygulamanın performansını artıracak mı?
alicanbatur

2
Cevabınız için teşekkürler, dinleyicinin durumunu veya bayrağını kontrol etmenin neden daha iyi olduğunu düşünüyorsunuz.
kapv89

2
Ne zaman a better designperformans sonuçları ima ediyorsun yoksa sadece biraz tatsız mı diyorsun?
RTF

132

Bir görünüm tıklanamazsa (örneğin, bir TextView) ayarın setOnClickListener(null)görünümün tıklanabilir olduğu anlamına geleceğini unutmayın. mMyView.setClickable(false)Görünümünüzün tıklanabilir olmasını istemiyorsanız kullanın . Örneğin, farklı durumlar için farklı renkler gösteren arka plan için çizilebilir bir xml kullanırsanız, görünümünüz yine de tıklanabilirse, kullanıcılar tıklayabilir ve garip görünebilecek farklı arka plan rengi gösterilir.


Bu, TextView ve benzerlerini bilmek iyidir, ancak bir ListView için daha önce bir OnClickListener ayarlandığında hiçbir etkisi yoktur.
Birisi Bir Yerde

4
Bu yüzden "Bir görünüm tıklanamazsa (örneğin bir TextView)" yazdım - bir ListView tıklanabilir ve bu nedenle bunun için çalışmaz.
FreewheelNat

Görünümün onClickListener'ı devre dışı bırakmak / etkinleştirmek için ileri geri geçiş yapmamız gerekiyorsa, bence bu setOnClickListener (null) ayarından daha iyi bir çözümdür.
Panini Luncher

1
view.setOnClickListener (null) ile birlikte view.setClickable (false) doğru cevaptır, teşekkürler !!!!
Petros Mastrantonas

12

Belki setOnClickListener(null)?


1
Bu, özellikle onay kutuları için çalışmaz ve muhtemelen diğer widget'lar için de çalışmaz.
Chris

8

Ayar setOnClickListener(null), çalışma zamanında tıklama dinleyiciyi kaldırmak için iyi bir fikirdir.

Ve ayrıca birisi View.hasOnClickListeners()bundan sonra aramanın döneceğini söyledi true, arkadaşım YOK .

İşte sınıftan hasOnClickListeners()alınan uygulamaandroid.view.View

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

Tanrıya şükür. Kontrol eder null.

Yani her şey güvende. Zevk almak :-)


4

Yukarıdaki cevaplar uçucu ve güvenilir değil. Bunu basit bir Göreceli Düzende bir ImageView ile yapmayı denedim ve onClick olayını devre dışı bırakmadı.

Benim için işe yarayan setEnabled kullanmaktı.

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

Daha sonra Görünüm'ün etkin olup olmadığını kontrol edebilirsiniz:

boolean ImageView.isEnabled();

Başka bir seçenek de, görünümün durumunu belirlemek için setContentDescription (String string) ve String getContentDescription () yöntemlerini kullanmaktır.


4

Sadece koy, benim için çalıştı

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

Sadece aşağıdaki gibi öğeyi yeniden başlatmak hile yapar. Öğeye göre onclick, onlonglick, onitemclick, onitemlongclick'i kaldıracaktı

mTitleView = findViewById (R.id.mTitleView);

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.