出现此警告是因为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;
}
// 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的View也未实现performClick并在检测到单击时调用它,则该View可能无法正确处理可访问性操作。理想情况下,应将处理单击动作的逻辑放在View#performClick中,因为某些可访问性服务应在发生单击动作时调用performClick。