需求:View的点击事件经常是发起业务,但是没做限制的话,快速点击会导致多次调用,发送错误逻辑。
有一种办法是点击了之后设置控件不可点击,待业务完成再恢复点击能力,但是这样每个点击控件都要进行相关的设置,量很大。
所以我想了个方法,自定义一个布局,设置点击间隔时间,继承相对布局,然后把有点击事件的控件外包裹这个布局,调用点击的地方使用自定义布局的点击事件便可,方法代码如下:
布局文件:
<e.DelayTouchRelativeLayout android:id="@+id/r1" android:layout_width="match_parent" android:layout_height="100dp" android:background="@color/b1"> <TextView android:id="@+id/t2" android:layout_width="100dp" android:layout_height="50dp" android:layout_centerInParent="true" android:background="@color/j"/> </e.DelayTouchRelativeLayout>
调用文件:
r1 = (DelayTouchRelativeLayout) findViewById(R.id.r1); r2 = (DelayTouchRelativeLayout) findViewById(R.id.r2); t2 = (TextView) findViewById(R.id.t2); t2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { QiuUtil.ShortToast("点击了t2"); } }); r1.setOnDelayClickListener(new DelayTouchRelativeLayout.OnDelayClickListener() { @Override public void onClick(View v) { QiuUtil.ShortToast("点击了第1个"); } });
自定义view:
public class DelayTouchRelativeLayout extends RelativeLayout { public DelayTouchRelativeLayout(Context context) { super(context); } public DelayTouchRelativeLayout(Context context, AttributeSet attrs) { super(context, attrs); } public DelayTouchRelativeLayout(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } private OnDelayClickListener mOnDelayClickListener; private long time1 = 0; private long time2 = 0; private int delaytime = 6000;//自定义点击间隔时间 public void setOnDelayClickListener(OnDelayClickListener mOnDelayClickListener) { this.mOnDelayClickListener = mOnDelayClickListener; } public interface OnDelayClickListener { void onClick(View v); } @Override public boolean onTouchEvent(MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_UP) { if (time1 == 0) { time1 = System.currentTimeMillis(); mOnDelayClickListener.onClick(this); } else { time2 = System.currentTimeMillis(); QiuUtil.LogE("time1:" + time1); QiuUtil.LogE("time2:" + time2); if (time2 - time1 > delaytime) { mOnDelayClickListener.onClick(this); time1 = time2; } } } return true; } }
还有一种更加简单方法:如下: