Это предупреждение появляется, потому что Android хочет напомнить вам подумать о слепых или слабовидящих людях, которые могут использовать ваше приложение. Я предлагаю вам посмотреть это видео, чтобы получить краткий обзор того, на что это похоже.
Все стандартные представления пользовательского интерфейса (например Button
, TextView
и т. Д.) Настроены для предоставления слепым пользователям соответствующей обратной связи через службы доступности. Когда вы пытаетесь самостоятельно обрабатывать сенсорные события, вы рискуете забыть предоставить эту обратную связь. Это то, для чего нужно предупреждение.
Вариант 1. Создайте собственное представление
Обработка событий касания обычно выполняется в настраиваемом представлении. Не отказывайтесь от этого варианта слишком быстро. Это не так уж и сложно. Вот полный пример, TextView
который переопределяется для обработки событий касания:
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();
}
}
Тогда вы просто использовали бы это так:
<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"/>
См. Мой другой ответ для получения дополнительных сведений о создании настраиваемого представления.
Вариант 2. Отключение предупреждения
В других случаях было бы лучше просто отключить предупреждение. Например, я не уверен, что вы хотите сделать с элементом Button
, для которого вам нужны события касания. Если вы должны были сделать пользовательскую кнопку и называется performClick()
в , onTouchEvent
как я сделал выше для таможни TextView
, то он будет вызываться дважды каждый раз , потому что Button
уже вызывает performClick()
.
Вот пара причин, по которым вы можете просто отключить предупреждение:
- Работа, которую вы выполняете с вашим событием касания, носит только визуальный характер. Это не влияет на фактическую работу вашего приложения.
- Вы бессердечны и не заботитесь о том, чтобы сделать мир лучше для слепых.
- Вам слишком лень копировать и вставлять код, который я дал вам в Варианте 1 выше.
Добавьте следующую строку в начало метода, чтобы подавить предупреждение:
@SuppressLint("ClickableViewAccessibility")
Например:
@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
вызвало setOnTouchListener, но не переопределяет performClick. Если представление, которое переопределяет onTouchEvent или использует OnTouchListener, также не реализует performClick и не вызывает его при обнаружении щелчков, представление может не обрабатывать действия специальных возможностей должным образом. В идеале логика обработки действий щелчка должна быть помещена в View # performClick, поскольку некоторые службы специальных возможностей вызывают performClick, когда должно произойти действие щелчка.