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:
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 Button
wydarzeniami dotykowymi, do których potrzebujesz. Jeśli było zrobić przycisk niestandardowy i nazywa performClick()
się onTouchEvent
tak jak ja powyżej dla zwyczaju TextView
, to byłoby uzyskać wywołana dwukrotnie za każdym razem, bo Button
już 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;
}
});
}
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.