Kiedy próbuję dodać onTouchListner()
do przycisku, pojawia się plik
Button wywołał setOnTouchListener, ale nie przesłania performClick
ostrzeżenie. Czy ktoś wie jak to naprawić?
btnleftclick.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
return false;
}
});
Błąd:
Widok niestandardowy wywołał na nim funkcję setOnTouchListener, ale nie przesłania performClick Jeśli widok, który przesłania onTouchEvent lub używa OnTouchListener, nie implementuje również performClick i wywołuje go po wykryciu kliknięć, widok może nie obsługiwać poprawnie działań związanych z ułatwieniami dostępu. Logika obsługująca akcje kliknięcia powinna być idealnie umieszczona w widoku # performClick, ponieważ niektóre usługi ułatwień dostępu wywołują performClick, gdy powinno nastąpić kliknięcie.
ImageView
wywołał na nim funkcję setOnTouchListener, ale nie przesłania performClick Jeśli widok, który przesłania onTouchEvent lub używa OnTouchListener, nie implementuje również performClick i wywołuje go po wykryciu kliknięć, widok może nie obsługiwać poprawnie działań związanych z ułatwieniami dostępu. Logika obsługująca akcje kliknięcia powinna być idealnie umieszczona w widoku # performClick, ponieważ niektóre usługi ułatwień dostępu wywołują performClick, gdy powinno nastąpić kliknięcie.Odpowiedzi:
To ostrzeżenie pojawia się, ponieważ Android chce przypomnieć Ci o osobach niewidomych lub niedowidzących, które mogą używać Twojej aplikacji. Proponuję obejrzeć ten film, aby uzyskać szybki przegląd tego, jak to jest.
Standardowe widoki UI (jak
Button
,TextView
etc.) są ustanowione, aby zapewnić użytkownikom ciemnej z odpowiedniej informacji zwrotnej za pośrednictwem usług dostępu. Kiedy próbujesz samodzielnie poradzić sobie ze zdarzeniami dotykowymi, istnieje ryzyko, że zapomnisz przekazać tę informację zwrotną. Po to jest ostrzeżenie.Opcja 1: utwórz widok niestandardowy
Obsługa zdarzeń dotykowych jest zwykle wykonywana w widoku niestandardowym. Nie odrzucaj tej opcji zbyt szybko. To naprawdę nie jest takie trudne. Oto pełny przykład a,
TextView
który jest zastępowany w celu obsługi zdarzeń dotykowych:Wtedy użyjesz go w ten sposób:
Zobacz moją drugą odpowiedź, aby uzyskać więcej informacji na temat tworzenia niestandardowego widoku.
Opcja 2: wyciszenie ostrzeżenia
Innym razem lepiej po prostu wyciszyć ostrzeżenie. Na przykład nie jestem pewien, co chcesz zrobić z
Button
wydarzeniami dotykowymi, do których potrzebujesz. Jeśli było zrobić przycisk niestandardowy i nazywaperformClick()
sięonTouchEvent
tak jak ja powyżej dla zwyczajuTextView
, to byłoby uzyskać wywołana dwukrotnie za każdym razem, boButton
już nazywaperformClick()
.Oto kilka powodów, dla których warto po prostu wyciszyć ostrzeżenie:
Dodaj następujący wiersz na początku metody, aby pominąć ostrzeżenie:
Na przykład:
źródło
MotionEvent event
obiektu w swojejdoSomething()
metodzie? Muszę sprawdzićevent.getY()
.performClick()
. Moja początkowa myśl jest taka, że jeślievent.getY()
nie jest integralną częścią rzeczywistego zdarzenia kliknięcia (tj. Wizualnych efektów interfejsu użytkownika), przenieś tę logikę z powrotem doonTouchEvent()
. W przeciwnym razie możesz utworzyć zmienną składową klasy, aby przechowywać ostatniąY
wartość akcji . Sugeruję również sprawdzenie kodu źródłowego kilku standardowych widoków, więc zobacz, jak implementuje go Android. Sam muszę je lepiej przestudiować.onTouchEvent()
ale nieperformClick()
. Może to obejmować przesunięcie, kliknięcie lub inne zdarzenie dotykowe, które próbujesz uchwycić.Rozwiązanie:
Utwórz klasę, która rozszerza Button lub inny widok, którego używasz, i nadpisz performClick ()
Teraz użyj tego TouchableButton w XML i / lub kodzie, a ostrzeżenie zniknie!
źródło
android.widget.Button
jest zakodowane na stałe, więc nie pozwala na to. Wydaje się, że jest to bardzo zamierzone ze strony zespołu programistów Androida.Czy próbowałeś dodać:
lub dodanie adnotacji wyłączającej:
?
źródło
https://developer.android.com/guide/topics/ui/accessibility/custom-views#custom-touch-events
źródło