W systemie Android większość metod detektora zdarzeń zwraca wartość logiczną. Co oznacza ta wartość prawda / fałsz? co to przyniesie następstwom wydarzeń?
class MyTouchListener implements OnTouchListener {
@Override
public boolean onTouch(View v, MotionEvent event) {
logView.showEvent(event);
return true;
}
}
Jeśli chodzi o powyższy przykład, jeśli zwrócono wartość true w metodzie onTouch , stwierdziłem, że każde zdarzenie dotykowe (DOWN, UP, MOVE itp.) Zostało przechwycone zgodnie z moim logView . Wręcz przeciwnie, jeśli wynik jest fałszywy, przechwycono tylko zdarzenie DOWN. Wydaje się więc, że zwrot false zapobiegnie propagacji zdarzenia. Mam rację ?
Ponadto w OnGestureListener wiele metod również musi zwracać wartość logiczną. Czy mają to samo znaczenie?
Z dokumentacji: http://developer.android.com/reference/android/view/View.OnTouchListener.html#onTouch(android.view.View , android.view.MotionEvent)
„Prawda, jeśli odbiorca wykorzystał zdarzenie, w przeciwnym razie fałsz”.
Jeśli zwrócisz wartość true, zdarzenie zostanie przetworzone. Jeśli nie, przejdzie do następnej warstwy w dół.
źródło
Wartość logiczna określa, czy zdarzenie jest używane, czy nie.
Tak, masz rację. Jeśli zwrócisz wartość false, następny detektor obsłuży zdarzenie. Jeśli zwróci wartość true, zdarzenie jest używane przez odbiornik i nie jest wysyłane do następnej metody.
źródło
true
oznacza, że zdarzenie zostało zużyte i chcesz, aby reszta wydarzeń została zawarta w geście - inni słuchacze / widoki nie otrzymają zdarzeń.false
oznacza pozwolić komuś innemu zająć się wydarzeniem. W rzeczywistości jest to jednak nieco bardziej szczegółowe; zobacz moją odpowiedź.Wszystkie powyższe odpowiedzi są poprawne, ale wynik jest inny, czy widok jest,
clickable
czy nieclickable
Przykład , mam
LinearLayout
zawiera 1Button
i 1 wTextView
ten sposóbW Aktywności mam kod podobny do
Przypadek 1
Linear onTouch return **FALSE**
,Button onTouch return **FALSE**
,TextView onTouch return **FALSE**
Kliknij przycisk
Kliknij TextView
Kliknij LinearLayout
Przypadek 2
Linear onTouch return **FALSE**
,Button onTouch return **TRUE**
,TextView onTouch return **TRUE**
Kliknij przycisk
Kliknij TextView
Kliknij LinearLayout
Przypadek 3
Linear onTouch return **TRUE**
,Button onTouch return **FALSE**
,TextView onTouch return **FALSE**
Kliknij przycisk
Kliknij TextView
Kliknij LinearLayout
Uwaga
TextView
jestnot clickable
to klikalne, jeśli ustawimyandroid:clickable="true"
w xml LUB kiedy ustawimytextView.setOnClickListener(...)
event MOVE
można wywołać więcej niż mój dziennik (opiera się na tym, jak stukasz)Podsumowanie
onTouch
powróttrue
lub widok jestclickable
, widok otrzyma wszystkoonTouchEvent
onTouch
powrótfalse
i widok nie jestclickable
, widok nie otrzyma NEXT onTouchEvent (może go otrzymać jego rodzic)Mam nadzieję, że pomoże to w
DEMO
źródło
Straciłem prawie jeden dzień na rozwiązywaniu problemów, nadal odkryłem, że moja funkcja onTouch jest wywoływana 2 razy, gdy używam true i 1 razy, gdy używam false.
źródło
event.getAction()
ponieważ jeśli wróciszfalse
na zdarzenie ACTION_DOWN, zdarzenie ACTION_UP jest ignorowane przez słuchaczaZ dokumentu systemu Android :
Uwaga: system Android najpierw wywoła procedury obsługi zdarzeń, a następnie odpowiednie domyślne programy obsługi z definicji klasy. W związku z tym zwrócenie wartości true z tych detektorów zdarzeń zatrzyma propagację zdarzenia do innych detektorów zdarzeń, a także zablokuje wywołanie zwrotne do domyślnej procedury obsługi zdarzeń w widoku. Dlatego upewnij się, że chcesz zakończyć zdarzenie, gdy zwrócisz wartość true.
źródło