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, TextViewetc.) 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, TextViewktóry jest zastępowany w celu obsługi zdarzeń dotykowych:
public class CustomTextView extends AppCompatTextView {
public CustomTextView(Context context) {
super(context);
}
public CustomTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
super.onTouchEvent(event);
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
return true;
case MotionEvent.ACTION_UP:
performClick();
return true;
}
return false;
}
// Because we call this from onTouchEvent, this code will be executed for both
// normal touch events and for when the system calls this using Accessibility
@Override
public boolean performClick() {
super.performClick();
doSomething();
return true;
}
private void doSomething() {
Toast.makeText(getContext(), "did something", Toast.LENGTH_SHORT).show();
}
}
Wtedy użyjesz go w ten sposób:
<com.example.myapp.CustomTextView
android:id="@+id/textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="20dp"
android:text="Click me to do something"/>
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 Buttonwydarzeniami dotykowymi, do których potrzebujesz. Jeśli było zrobić przycisk niestandardowy i nazywa performClick()się onTouchEventtak jak ja powyżej dla zwyczaju TextView, to byłoby uzyskać wywołana dwukrotnie za każdym razem, bo Buttonjuż nazywa performClick().
Oto kilka powodów, dla których warto po prostu wyciszyć ostrzeżenie:
- Praca, którą wykonujesz ze zdarzeniem dotykowym, jest tylko wizualna. Nie ma to wpływu na rzeczywiste działanie Twojej aplikacji.
- Masz zimne serce i nie zależy ci na tym, by uczynić świat lepszym miejscem dla niewidomych.
- Jesteś zbyt leniwy, aby skopiować i wkleić kod, który podałem w opcji 1 powyżej.
Dodaj następujący wiersz na początku metody, aby pominąć ostrzeżenie:
@SuppressLint("ClickableViewAccessibility")
Na przykład:
@SuppressLint("ClickableViewAccessibility")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button myButton = findViewById(R.id.my_button);
myButton.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
return false;
}
});
}
ImageViewwywoł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.