当我尝试为按钮添加ontouchListner
时,我
Button上调用了setOnTouchListener,但没有覆盖 performClick
警告。谁知道怎么修它。 谢谢..
btnleftclick.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
return false;
}
});
错误:
自定义视图已调用setOnTouchListener,但未覆盖 performClick如果一个覆盖onTouchEvent或使用的视图 OnTouchListener也没有实现performClick并在调用时调用它 检测到点击次数,View可能无法处理辅助功能操作 正常。理想情况下,应该放置处理点击操作的逻辑 查看#performClick,因为某些辅助功能服务会调用performClick 当发生点击动作时。
答案 0 :(得分:56)
此警告出现是因为Android想要提醒您考虑可能正在使用您的应用的盲人或视障人士。我建议你观看this video,以便快速了解它是什么样的。
标准的用户界面视图(如Button
,TextView
等)都设置为通过辅助功能服务为盲人用户提供适当的反馈。当您尝试自己处理触摸事件时,您将面临忘记提供反馈的危险。这就是警告的内容。
处理触摸事件通常是在自定义视图中完成的事情。不要过快地忽略此选项。这并不是那么困难。以下是覆盖触摸事件的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。
其他时候,让警告静音可能会更好。例如,我不确定你想要用Button
做什么,你需要触摸事件。如果您要制作一个自定义按钮并在performClick()
中调用onTouchEvent
,就像上面针对自定义TextView
所做的那样,那么每次都会调用两次,因为Button
已经调用了performClick()
。
以下几个原因可能只是让警告静音:
将以下行添加到方法的开头以禁止警告:
@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;
}
});
}
答案 1 :(得分:12)
<强>解决方案:强>
创建一个扩展Button或您正在使用的任何视图的类并覆盖 performClick()
class TouchableButton extends Button {
@Override
public boolean performClick() {
// do what you want
return true;
}
}
现在在xml和/或代码中使用此TouchableButton,警告就会消失!
答案 2 :(得分:8)
您是否尝试过添加:
view.performClick()
或添加suppresslint注释:
@SuppressLint("ClickableViewAccessibility")
答案 3 :(得分:1)
自定义视图控件可能需要非标准的触摸事件行为。 例如,自定义控件可以使用onTouchEvent(MotionEvent) 用于检测ACTION_DOWN和ACTION_UP事件的侦听器方法,以及 触发特殊点击事件。为了保持兼容 辅助功能服务,用于处理此自定义click事件的代码 必须执行以下操作:
为解释后的点击生成适当的AccessibilityEvent 行动。启用辅助功能以执行自定义点击 对于无法使用触摸屏的用户的操作。处理 这些要求以有效的方式,您的代码应覆盖 performClick()方法,该方法必须调用的超级实现 此方法,然后执行 点击事件。检测到自定义点击操作后,该代码 然后应调用您的performClick()方法。
https://developer.android.com/guide/topics/ui/accessibility/custom-views#custom-touch-events