[英]How to prevent double tap in Android across app?
我的应用程序由大约 50-60 个屏幕构建。 每个屏幕都有一个按钮来打开一个新屏幕。 现在我面临的问题是当用户双击按钮时,新屏幕会打开两次。
对于这个问题,我找到了如下解决方案。
if (SystemClock.elapsedRealtime() - mLastClickTime < 1000){
return;
}
mLastClickTime = SystemClock.elapsedRealtime();
但是为了防止双击,我需要在每次按钮点击时写上上面的代码。 我还没有创建随处使用的通用自定义按钮。
有没有办法在应用程序级别双击?
使用这个自定义类,它可以处理按钮单击事件上的任何双标签或单标签
public class DoubleTabCustomButton implements View.OnClickListener {
private boolean isRunning = true;
private int resetInTime = 500;
private int counter = 0;
private DoubleClickCallback listener;
public DoubleTabCustomButton(Context context) {
listener = (DoubleClickCallback) context;
}
@Override
public void onClick(View v) {
if (isRunning) {
if (counter == 1) {
listener.onDoubleClick(v);
}
else if (counter==0){
listener.onSingleClick(v);
}
counter++;
if (!isRunning) {
isRunning = true;
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(resetInTime);
isRunning = false;
counter = 0;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
}
}
}
它的界面
public interface DoubleClickCallback {
public void onDoubleClick(View v);
public void onSingleClick(View V);
}
最后你可以在这样的活动中使用
public class ButtonDoubleTab extends AppCompatActivity implements DoubleClickCallback {
Button btndoubletab;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_button_double_tab);
btndoubletab=findViewById(R.id.btndoubletab);
// btndoubletab.setOnClickListener(this);
btndoubletab.setOnClickListener(new DoubleTabCustomButton(this));
}
@Override
public void onDoubleClick(View v) {
//do double tab action
}
@Override
public void onSingleClick(View V) {
//single tab action
}
}
我遇到了同样的问题,我解决了它,如下所示,它可能对您有所帮助。
您可以通过两种方式实现一:尝试使用boolean
变量:
public class Blocker {
private static final int BLOCK_TIME = 1000;
private boolean isBlockClick;
/**
* Block any event occurs in 1000 millisecond to prevent spam action
* @return false if not in block state, otherwise return true.
*/
public boolean block(int blockInMillis) {
if (!isBlockClick) {
isBlockClick= true;
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
isBlockClick= false;
}
}, blockInMillis);
return false;
}
return true;
}
public boolean block() {
return block(BLOCK_TIME );
}
}
在每次点击时使用如下。
button.setOnClickListener(new View.OnClickListener() {
private Blocker blocker = new Blocker();
@Override
public void onClick(View v) {
if (!blocker.block(block-Time-In-Millis)) {
// do your action
}
}
});
两个或者你可以在按钮的每个点击事件上设置button.setEnable(false)
,如下所示
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
btn.setEnabled(false);
}
});
如果你有一个基本的活动类,你可以覆盖 startActivity(Intent) 方法来添加 Intent.FLAG_ACTIVITY_REORDER_TO_FRONT
abstract class BaseActivity: AppCompatActivity() {
final override fun startActivity(intent: Intent) {
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT)
super.startActivity(intent)
}
}
使用这个内联函数:
inline fun View.onSingleClick(minimumClickInterval: Long = 800, crossinline onClick: (View?) -> Unit) {
var isViewClicked = false
var mLastClickTime = 0L
setOnClickListener { view ->
val currentClickTime = SystemClock.uptimeMillis()
val elapsedTime = currentClickTime - mLastClickTime
mLastClickTime = currentClickTime
if (elapsedTime <= minimumClickInterval)
return@setOnClickListener
if (!isViewClicked) {
isViewClicked = true
Handler(Looper.getMainLooper()).postDelayed({ isViewClicked = false }, 600)
} else {
return@setOnClickListener
}
onClick(view)
Log.d(this.javaClass.simpleName, "onSingleClick successfully called")
}
}
与这样的任何视图一起使用:
button.onSingleClick {
// do something here on the button click
}
您还可以像这样设置最小点击间隔:
button.onSingleClick(1000) {
// do something here on the button click
}
使button
在单击时禁用。
b.setEnabled(false);
您可以将其重新启用onResume
或任何其他特定回调
b.setEnabled(true);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.