出现此警告是因为 Android 想要提醒您考虑可能正在使用您的应用的盲人或视障人士。我建议您观看this video 以快速了解情况。
标准 UI 视图(如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"/>
有关制作自定义视图的更多详细信息,请参阅my other answer。
选项 2:消除警告
其他时候最好让警告静音。例如,我不确定您想对需要触摸事件的Button 做什么。如果您要创建一个自定义按钮并在onTouchEvent 中调用performClick(),就像我在上面为自定义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;
}
});
}