这个警告出现是因为Android想提醒您考虑到使用您的应用程序的盲人或视觉受损人士。我建议您观看这个视频,快速了解一下相关情况。
标准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;
}
@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
。如果您制作了自定义按钮并在onTouchEvent
中像我上面为自定义 TextView
所做的那样调用了performClick()
,那么每次都会被调用两次,因为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
。 - Garry