onTouchListener warning: onTouch should call View#performClick when a click is detected
我创建了一个
1 com/calculator/activitys/Calculator$1#onTouch should call View#performClick when a click is detected
是什么意思?我尚未找到有关此警告的任何信息。这是完整的代码:
1 2 3 4 5 6 7 8 9 10 11 | LinearLayout llCalculatorContent = (LinearLayout) fragmentView.findViewById(R.id.calculator_content); llCalculatorContent.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { Tools.hideKeyboard(getActivity(), getView()); getView().clearFocus(); return false; } }); |
您在这里:
1 2 3 4 5 6 7 8 9 10 11 12 13 | public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: //some code.... break; case MotionEvent.ACTION_UP: v.performClick(); break; default: break; } return true; } |
如果您没有使用显式覆盖
除了他的答案外,要在
示例:
自定义视图类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | public class UselessButton extends AppCompatButton { public UselessButton(Context context) { super(context); } public UselessButton(Context context, AttributeSet attrs) { super(context, attrs); } public UselessButton(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override public boolean performClick() { return super.performClick(); } } |
XML:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <stackoverflow.onEarth.UselessButton android:id="@+id/left" android:layout_width="60dp" android:layout_height="60dp" android:layout_marginStart="16dp" android:layout_marginTop="16dp" android:layout_marginEnd="8dp" android:layout_marginBottom="8dp" android:background="@drawable/left" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.16" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintBaseline_toBaselineOf="@+id/right" app:layout_constraintVertical_bias="0.5" /> |
Java:
1 2 3 4 5 6 7 8 9 10 11 12 13 | left.setOnTouchListener((v, event) -> { if (event.getAction() == MotionEvent.ACTION_DOWN) { enLeft = 1; enRight = 0; return true; } else if (event.getAction() == MotionEvent.ACTION_UP) { enLeft = 0; v.performClick(); return false; } else { return false; } }); |
当前问题:警告已通过IDE解决,但无法在实际的Android设备上看到此按钮实际上执行的点击操作。
编辑:修复了获取点击事件:使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | down.setOnTouchListener((v, event) -> { if (event.getAction() == MotionEvent.ACTION_DOWN) { enFront = 0; enBack = 1; left.setPressed(true); return true; } else if (event.getAction() == MotionEvent.ACTION_UP) { enBack = 0; v.performClick(); v.setPressed(false); return false; } else { return false; } |
您可以抑制皮棉
1 | @SuppressLint("ClickableViewAccessibility") |
您应该在
1 2 3 4 5 6 7 | @Override public boolean onTouchEvent(MotionEvent event) { //A logic performClick(); return super.onTouchEvent(event); } |
或
1 2 3 4 5 6 7 8 9 | findViewById(R.id.view1).setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { v.performClick(); return v.onTouchEvent(event); } }); |
在此处了解更多信息
只需调用performClick方法,如下所示:
1 2 3 4 5 6 7 | @Override public boolean onTouch(View v, MotionEvent event) { v.performClick(); Tools.hideKeyboard(getActivity(), getView()); getView().clearFocus(); return false; } |
我在
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | class TouchListener(context: Context) : MultiTouchListener() { private var tochedView: View? = null private var mGestureDetector = CustomGestureDetector() private var gestureDetector: GestureDetector = GestureDetector(context, mGestureDetector) @SuppressLint("ClickableViewAccessibility") override fun onTouch(view: View?, event: MotionEvent?): Boolean { val aux = super.onTouch(view, event) tochedView = view gestureDetector.onTouchEvent(event) return aux } private inner class CustomGestureDetector: GestureDetector.SimpleOnGestureListener() { override fun onSingleTapUp(e: MotionEvent?): Boolean { // this will be called even when a double tap is tochedView?.performClick() return super.onSingleTapUp(e) } override fun onSingleTapConfirmed(e: MotionEvent?): Boolean { // this will only be called after the detector is confident that the // user's first tap is not followed by a second tap leading to a double-tap gesture. tochedView?.performClick() return super.onSingleTapConfirmed(e) } } } |