Android 按钮已经调用了 setOnTouchListener,但是没有覆盖 PerformClick

当我尝试将 onTouchListner()添加到按钮时,它会为我提供

按钮对其调用 setOnTouchListener,但不重写 执行单击

警告,有人知道怎么修吗?

1

btnleftclick.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
return false;
}
});

错误:

自定义视图对其调用 setOnTouchListener,但不重写 如果覆盖 onTouchEvent 的视图或使用 OnTouchListener 也不实现 PerformClick 并在以下情况下调用它 如果检测到单击,则视图可能无法处理可访问性操作 处理点击操作的逻辑应该放在 查看 # PerformClick 作为一些可访问性服务调用 PerformClick 当点击动作应该发生时。

110832 次浏览

你有没有试过加上:

view.performClick()

或者添加 subresslint 注释:

@SuppressLint("ClickableViewAccessibility")

解决方案:

  1. 创建一个扩展 Button 或您正在使用的任何视图的类,并重写 < strong > PerformClick ()

    class TouchableButton extends Button {
    
    
    @Override
    public boolean performClick() {
    // do what you want
    return true;
    }
    }
    
  2. Now use this TouchableButton in xml and/or code and the warning will be gone!

之所以出现这个警告,是因为 Android 希望提醒您注意那些可能正在使用您的应用程序的盲人或视力障碍者。我建议您观看 这个视频,快速了解一下这是什么感觉。

标准的 UI 视图(如 ButtonTextView等)都是通过易访问性服务为盲人用户提供适当的反馈。当你试图自己处理触摸事件时,你有忘记提供反馈的危险。这就是警告的作用。

选项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做什么。如果你要制作一个自定义按钮并在 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;
}
});
}

自定义视图控件可能需要非标准的触摸事件行为。 例如,自定义控件可以使用 onTouchEvent (MotionEvent) 侦听器方法来检测 ACTION _ DOWN 和 ACTION _ UP 事件,并且 触发一个特殊的单击事件。为了保持与 可访问性服务,即处理此自定义单击事件的代码 必须做到以下几点:

为解释的单击生成适当的 AccessibilityEvent 允许可访问性服务执行自定义单击 为不能使用触摸屏的用户提供的操作 以有效的方式满足这些要求,则代码应重写 方法,该方法必须调用 方法,然后执行 当检测到自定义单击操作时,该代码 然后应该调用 PerformClick ()方法。

Https://developer.android.com/guide/topics/ui/accessibility/custom-views#custom-touch-events

在重写的 OnTouchListener 中,将 MotionEvent 解释为单击,调用 view.performClick();(这将调用 onClick ())。

它是给用户反馈,例如以点击声的形式。

你可以压制一个警告

@SuppressLint("ClickableViewAccessibility")

或者打电话给 performClick()

[例子]