当前位置: 首页 > 知识库问答 >
问题:

Android按钮调用了setOnTouchListener,但不重写performClick

缪英锐
2023-03-14

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

按钮调用了setOnTouchListener,但不重写performClick

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

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

共有1个答案

秦渝
2023-03-14

出现这个警告是因为Android想要提醒你想想那些可能正在使用你的应用程序的盲人或视障人士。我建议你看这段视频来快速了解一下这是什么样子的。

标准UI视图(像buttontextview等)的设置都是为了通过辅助功能服务为盲人用户提供适当的反馈。当你尝试自己处理触摸事件时,你有忘记提供反馈的危险。这就是警告的目的。

处理触摸事件通常是在自定义视图中完成的。不要太快地放弃这个选项。其实没那么难。下面是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"/>

有关制作自定义视图的更多细节,请参阅我的另一个答案。

其他时候最好只是沉默警告。例如,我不确定您想对需要触摸事件的按钮做什么。如果您要创建一个自定义按钮,并在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;
        }
    });
}
 类似资料:
  • 我创建了一个实现一点OpenCV的Android活动。它所做的只是简单地创建一个自定义相机视图,当屏幕被触摸时,照片就会被保存。 我唯一的问题是BaseLoaderCallback内部的代码包含一个警告。 警告 自定义视图com/example/zcameratestv2/version2cameraView调用了setOnTouchListener,但不重写performClick 与其他问题不

  • 我一直在跟一门课,但似乎没有奏效(也可能是我太糟糕了,搞错了什么东西)。 我应该在contenidoactivity.java中输入一个名称,然后按下一个按钮(onclick:enviarNombre被选中),并将该名称获取到destinoactivity.java txt,但它只是停留在那里,当我单击该按钮时,它没有改变任何东西。我已经放了一个吐司“has seleccionado enviar

  • [在这里输入图像描述][1]这是我的第一个android studio项目。尽管导入了Widget.Button包,但无法调用Button类。Pl指南。[主要活动屏幕快照。[][2

  • 我在https://stackoverflow.com/a/20323723/3888000中搜索如何减少按钮内的填充,发现我应该在xml文件中将按钮的最小高度设置为0dp。是的,它对我有效。 问题是:我想以编程方式创建按钮,而setMinimumHeight(1)和setMinHeight(1)都没有工作。怎么做? 顺便问一下,这两种方法有什么不同? 谢谢!

  • 我有一个订单按钮应该是重定向用户到购物车页面与订购的项目 这是网上的路线。php 这是函数addToCart 但是当我点击按钮时,它不会重定向到购物车页面,它会一直加载到我所做的同一个位置 在函数上,它输出正确的结果

  • 如何在无限次或动态地单击按钮时添加新的?或者简单地说,如何执行添加更多按钮的功能? 我在Javafx中尝试过,但它只是在列表中添加了两个按钮。 但我必须动态添加,直到用户想要添加/按下上一个按钮