gpt4 book ai didi

Android 按钮调用了 setOnTouchListener 但不覆盖 performClick

转载 作者:IT老高 更新时间:2023-10-28 13:12:11 35 4
gpt4 key购买 nike

当我尝试将 onTouchListner() 添加到按钮时,它让我得到了

Button has setOnTouchListener called on it but does not override performClick

警告。有人知道怎么解决吗?

1

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

错误:

Custom view has setOnTouchListener called on it but does not override performClick If a View that overrides onTouchEvent or uses an OnTouchListener does not also implement performClick and call it when clicks are detected, the View may not handle accessibility actions properly. Logic handling the click actions should ideally be placed in View#performClick as some accessibility services invoke performClick when a click action should occur.

最佳答案

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

标准 UI View (如 ButtonTextView 等)均设置为通过无障碍服务为盲人用户提供适当的反馈。当您尝试自己处理触摸事件时,您就有忘记提供反馈的危险。这就是警告的目的。

选项 1:创建自定义 View

处理触摸事件通常是在自定义 View 中完成的。不要太快关闭此选项。这并不是那么困难。下面是一个完整的 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有关制作自定义 View 的更多详细信息。

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

关于Android 按钮调用了 setOnTouchListener 但不覆盖 performClick,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47107105/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com