Questo avviso viene visualizzato perché Android vuole ricordarti di pensare alle persone non vedenti o ipovedenti che potrebbero utilizzare la tua app. Ti suggerisco di guardare questo video per una rapida panoramica di com'è.
Le visualizzazioni dell'interfaccia utente standard (come Button
, TextView
ecc.) Sono tutte impostate per fornire agli utenti non vedenti un feedback appropriato attraverso i servizi di accessibilità. Quando provi a gestire tu stesso gli eventi tattili, rischi di dimenticarti di fornire quel feedback. A questo serve l'avvertimento.
Opzione 1: crea una visualizzazione personalizzata
La gestione degli eventi di tocco è normalmente qualcosa che viene eseguito in una visualizzazione personalizzata. Non ignorare questa opzione troppo rapidamente. Non è poi così difficile. Ecco un esempio completo di un TextView
che viene sovrascritto per gestire gli eventi di tocco:
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();
}
}
Quindi lo useresti in questo modo:
<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"/>
Vedi la mia altra risposta per maggiori dettagli sulla creazione di una visualizzazione personalizzata.
Opzione 2: silenziare l'avviso
Altre volte potrebbe essere meglio silenziare l'avvertimento. Ad esempio, non sono sicuro di cosa vuoi fare con un Button
evento per il quale hai bisogno di eventi di tocco. Se si dovesse fare un pulsante personalizzato e chiamato performClick()
a onTouchEvent
come ho fatto in precedenza per il costume TextView
, allora sarebbe ottenere chiamato due volte ogni volta perché Button
già le chiamate performClick()
.
Ecco un paio di motivi per cui potresti voler silenziare l'avviso:
- Il lavoro che stai eseguendo con il tuo evento touch è solo visivo. Non influisce sul funzionamento effettivo della tua app.
- Hai un cuore freddo e non ti interessa rendere il mondo un posto migliore per i ciechi.
- Sei troppo pigro per copiare e incollare il codice che ti ho fornito nell'opzione 1 sopra.
Aggiungere la seguente riga all'inizio del metodo per eliminare l'avviso:
@SuppressLint("ClickableViewAccessibility")
Per esempio:
@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
ha impostato setOnTouchListener ma non sostituisce performClick Se una visualizzazione che sostituisce onTouchEvent o utilizza un OnTouchListener non implementa anche performClick e la chiama quando vengono rilevati clic, la visualizzazione potrebbe non gestire correttamente le azioni di accessibilità. La logica che gestisce le azioni di clic dovrebbe idealmente essere collocata in Visualizza # performClick poiché alcuni servizi di accessibilità richiamano performClick quando dovrebbe verificarsi un'azione di clic.