android按钮调用了setOnTouchListener,但没有覆盖performClick

时间:2017-11-04 03:34:50

标签: android ontouchlistener

当我尝试为按钮添加ontouchListner时,我

  

Button上调用了setOnTouchListener,但没有覆盖   performClick

警告。谁知道怎么修它。  谢谢..

1

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

错误:

  

自定义视图已调用setOnTouchListener,但未覆盖   performClick如果一个覆盖onTouchEvent或使用的视图   OnTouchListener也没有实现performClick并在调用时调用它   检测到点击次数,View可能无法处理辅助功能操作   正常。理想情况下,应该放置处理点击操作的逻辑   查看#performClick,因为某些辅助功能服务会调用performClick   当发生点击动作时。

4 个答案:

答案 0 :(得分:56)

此警告出现是因为Android想要提醒您考虑可能正在使用您的应用的盲人或视障人士。我建议你观看this video,以便快速了解它是什么样的。

标准的用户界面视图(如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"/>

有关制作自定义视图的详细信息,请参阅my other answer

选项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;
        }
    });
}

答案 1 :(得分:12)

<强>解决方案:

  1. 创建一个扩展Button或您正在使用的任何视图的类并覆盖 performClick()

    class TouchableButton extends Button {
    
        @Override
        public boolean performClick() {
            // do what you want
            return true;
        }
    }
    
  2. 现在在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