1.android:splitMotionEvents="false"
xml布局中,在父控件中设置该属性,同时点击多个所属的子view,只响应一个事件(只能是父控件的以下层view,多层嵌套无效)
2.Listview属性android:choiceMode="singleChoice" 设置后每次只能选中一个item
3.全局禁止多点触控
在application的Theme中设置:
<item name="android:windowEnableSplitTouch">false</item>
<item name="android:splitMotionEvents">false</item>
4.控件防多次重复点击
public class ViewClickHelper {
/**
* 防止控件重复点击
* @param action1 监听
* @param views 点击view
*/
public static void setOnClickListeners(final Action1<View> action1, @NonNull View... views) {
for (View view : views) {
//throttleFirst只响应第一个点击事件
ViewClickHelper.onClick(view).throttleFirst(800, TimeUnit.MILLISECONDS).subscribe(new Consumer<View>() {
@Override
public void accept(View view) throws Exception {
action1.onClick(view);
}
});
}
}
/**
* 监听onclick事件防重复点击
* @param view
* @return
*/
private static Observable<View> onClick(@NonNull View view) {
checkNotNull(view, "view ==null");
return Observable.create(new ViewClickOnSubscribe(view));
}
public interface Action1<T> {
void onClick(T t);
}
private static class ViewClickOnSubscribe implements ObservableOnSubscribe<View> {
private View view;
public ViewClickOnSubscribe(View view) {
this.view = view;
}
@Override
public void subscribe(ObservableEmitter<View> e) throws Exception {
checkUiThread();
View.OnClickListener onClickListener = new View.OnClickListener() {
@Override
public void onClick(View view) {
if (!e.isDisposed()) {
e.onNext(view);
}
}
};
view.setOnClickListener(onClickListener);
}
}
private static void checkUiThread() {
if (Looper.getMainLooper() != Looper.myLooper()) {
throw new IllegalStateException(
"Must be called from the main thread. Was: " + Thread.currentThread());
}
}
private static <T> T checkNotNull(T value, String message) {
if (value == null) {
throw new NullPointerException(message);
}
return value;
}
}
4.通过系统时间,禁止快速点击(例如RecyclerView短时间内点击多个item)
private long lastClickTime = 0L;
// 两次点击最少间隔时间
private static final int CLICK_DELAY_TIME = 1000;
//在设置Item的监听时
item.setOnItemClickListener(xxx){
if (System.currentTimeMillis() - lastClickTime >= CLICK_DELAY_TIME) {
lastClickTime = System.currentTimeMillis();
//下面进行其他操作,比如跳转等
...
}
}
5.上面两个(3、4)也可以结合起来用,禁止短时间内recyclerview的多个item被多次点击,从而触发跳转多个界面等操作
参考https://blog.csdn.net/hust_twj/article/details/78742453