Ada*_*gyi 12 android android-button
如果我快速点击我的Android应用程序中的按钮,它背后的代码似乎运行两次.如果我单击我的菜单按钮两次,必须启动的活动onclick只启动两次,我必须从它退出两次.
这真的很烦人,因为如果我点击太快的菜单按钮我可以在后台加载一大堆活动,我必须逐个退出它们,所以这显然是我的应用程序的错误状态我想解决这个问题.
我该怎么办这个问题?
我使用简单的onClickListeners和Buttons
编辑:
关于答案和评论,我的菜单按钮如下所示:
top20Button.setOnClickListener(new OnClickListener()
{
public void onClick(View v)
{
favButton.setClickable(false);
nearButton.setClickable(false);
highlightedButton.setClickable(false);
top20Button.setClickable(false);
Intent i = new Intent();
i.putExtra("showDialog", false);
i.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
i.setClass(Search.this, Top20.class);
startActivity(i);
finish();
}
});
Run Code Online (Sandbox Code Playgroud)
在所有这些修正之后它仍然是相同的:S当我像疯子一样点击时,多个活动在历史堆栈上,我必须多次退出.
有什么建议 ?什么mi做错了?
您可以使用以下代码:btn.setEnabled(false);
btn.setOnclickListener(new View.onClickListener(){
public void onClick(View v) {
btn.setEnabled(false);
}
});
Run Code Online (Sandbox Code Playgroud)
您可以像这样暂时禁用视图
public static void disableTemporarly(final View view) {
view.setEnabled(false);
view.post(new Runnable() {
@Override
public void run() {
view.setEnabled(true);
}
});
}
Run Code Online (Sandbox Code Playgroud)
编辑:
上述解决方案将正常工作。但是使用 Kotlin 的强大功能会变得更好
1) 创建 SafeClikc 监听器
class SafeClickListener(
private var defaultInterval: Int = 1000,
private val onSafeCLick: (View) -> Unit
) : View.OnClickListener {
private var lastTimeClicked: Long = 0
override fun onClick(v: View) {
if (SystemClock.elapsedRealtime() - lastTimeClicked < defaultInterval) {
return
}
lastTimeClicked = SystemClock.elapsedRealtime()
onSafeCLick(v)
}
}
Run Code Online (Sandbox Code Playgroud)
2) 添加扩展函数以使其适用于任何视图,这将创建一个新的 SafeClickListener 并将工作委托给它
fun View.setSafeOnClickListener(onSafeClick: (View) -> Unit) {
val safeClickListener = SafeClickListener {
onSafeClick(it)
}
setOnClickListener(safeClickListener)
}
Run Code Online (Sandbox Code Playgroud)
3)现在使用起来非常方便
settingsButton.setSafeOnClickListener {
showSettingsScreen()
}
Run Code Online (Sandbox Code Playgroud)
快乐科特林 ;)
Button.setOnClickListener(new View.OnClickListener {
@Override
public void onClick(final View v) {
v.setEnabled(false);
v.postDelayed(new Runnable() {
@Override
public void run() {
v.setEnabled(true);
}
},150); //150 is in milliseconds
}
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7213 次 |
| 最近记录: |