Mam obiekt, w którym tekst cyklicznie wyświetla komunikaty o stanie. Gdy wiadomości się zmieniają, chcę, aby zdarzenie kliknięcia obiektu uległo zmianie, aby zabrać Cię do działania, którego dotyczy wiadomość.
Mam więc TextView mTitleView
i przypisuję takie wydarzenie.
public void setOnTitleClickListener(OnClickListener listener) {
mTitleView.setOnClickListener(listener);
}
Jak usunąć to zdarzenie kliknięcia? Niektóre komunikaty o stanie nie mają obszaru, w którym można wykonać akcję, dlatego chciałbym wyłączyć zdarzenie kliknięcia. Chciałbym również móc cyklicznie przełączać się między tymi zdarzeniami kliknięć i usuwać je w odpowiedni sposób, ale nie jestem pewien najlepszej praktyki.
a better design
że sugerujesz wpływ na wydajność, czy po prostu mówisz, że to trochę niesmaczne?Pamiętaj, że jeśli widoku nie można kliknąć (na przykład TextView), ustawienie
setOnClickListener(null)
oznacza, że widok można kliknąć. Użyj,mMyView.setClickable(false)
jeśli nie chcesz, aby Twój widok był klikalny. Na przykład jeśli użyjesz xml rysowalnego dla tła, który pokazuje różne kolory dla różnych stanów, jeśli twój widok jest nadal klikalny, użytkownicy mogą go kliknąć, a inny kolor tła pokaże, co może wyglądać dziwnie.źródło
Być może
setOnClickListener(null)
?źródło
Ustawienie
setOnClickListener(null)
jest dobrym pomysłem, aby usunąć detektor kliknięć w czasie wykonywania.A także ktoś skomentował, że dzwonienie
View.hasOnClickListeners()
po tym wrócitrue
, NIE mój przyjacielu.Oto implementacja
hasOnClickListeners()
wzięta zandroid.view.View
klasyDzięki Bogu. Sprawdza, czy
null
.Więc wszystko jest bezpieczne. Cieszyć się :-)
źródło
Powyższe odpowiedzi wydają się niepotrzebne i niewiarygodne. Próbowałem to zrobić za pomocą ImageView w prostym układzie względnym i nie wyłączało to zdarzenia onClick.
Dla mnie zadziałało użycie setEnabled.
Następnie możesz sprawdzić, czy Widok jest włączony za pomocą:
Inną opcją jest użycie setContentDescription (String string) i String getContentDescription () do ustalenia statusu widoku.
źródło
Mówiąc wprost, to zadziałało dla mnie
źródło
źródło
Wystarczy ponowna inicjalizacja przedmiotu, jak poniżej. Usuwałby onclick, onlonglick, onitemclick, onitemlongclick na podstawie elementu
mTitleView = findViewById (R.id.mTitleView);
źródło