如果我在Android应用中快速点击我的按钮,它背后的代码似乎会运行两次。 如果我单击我的菜单按钮两次,则必须启动的活动才会启动两次,我必须退出两次。
这真的很烦人,因为如果我点击菜单按钮太快我可以在后台加载一大堆活动,我必须逐个退出它们,所以这显然是我的应用程序的错误状态我想要解决这个问题。
我该怎么办这个问题?
我使用简单的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();
}
});
经过所有这些修正后,它仍然是相同的:S 当我像疯子一样点击时,多个活动在历史堆栈上,我必须多次退出。
有什么建议吗?我做错了什么?
答案 0 :(得分:8)
您可以使用以下代码: btn.setEnabled(false);
btn.setOnclickListener(new View.onClickListener(){
public void onClick(View v) {
btn.setEnabled(false);
}
});
答案 1 :(得分:4)
您可以像这样暂时禁用视图
public static void disableTemporarly(final View view) {
view.setEnabled(false);
view.post(new Runnable() {
@Override
public void run() {
view.setEnabled(true);
}
});
}
修改强>
上述解决方案可以正常工作。 但是当使用Kotlin的力量时它会变得更好
1)创建SafeClikc Listener
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)
}
}
2)添加扩展功能以使其适用于任何视图,这将创建一个新的SafeClickListener并将工作委托给它
fun View.setSafeOnClickListener(onSafeClick: (View) -> Unit) {
val safeClickListener = SafeClickListener {
onSafeClick(it)
}
setOnClickListener(safeClickListener)
}
3)现在它很容易使用
settingsButton.setSafeOnClickListener {
showSettingsScreen()
}
快乐的Kotlin;)
答案 2 :(得分:2)
嗯,这是预期的行为......
使用SINGLE_TOP标志启动您的新活动
或者尝试在AndroidManifest.xml中为Top20活动设置android:launchMode="singleInstance"
答案 3 :(得分:2)
这解决了多个活动实例的问题,并且仍然播放默认动画
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
答案 4 :(得分:0)
此解决方案更符合我的要求。而是使用启用/禁用视图功能。我使用时间,首先,创建一个变量来存储用户最后一次按下视图*然后当用户按下视图时,在变量中捕获时间以比较当前时刻和用户最后一次按下视图,如果时间之间的差异时间太小,这意味着快速,或者非常快,只要忽略它,那就是它。但是如果它是合理的时间,请将当前时间的最后一个时间变量设置为你想做的其他事情。
@Override
public void onListItemClick(ListView list, View item, int position, long id) {
Long now = System.currentTimeMillis();
if((now - lastTimeSelected) > 500){
lastTimeSelected = now;
// your code goes here
} else {
Log.i(TAG, "Too fast!");
}
}
我在其他帖子上看到了类似的answer,但似乎没有人喜欢这种做法。
答案 5 :(得分:0)
将以下代码snipet添加到Androidmanifest.xml中的Activity定义
android:launchMode = "singleTask"
答案 6 :(得分:0)
在frozen
类中使用Application
变量。
那是
public class App extends Application {
public static boolean frozen = false;
}
点击时某处:
//...
onClick() {
if (frozen) {
return;
}
frozen = true
}
//...
例如,某个地方要发布新的活动
onCreate (...) {
super.onCreate(...);
frozen = false;
}
AndroidManifest.xml
中的:
<application
android:allowBackup="true"
android:largeHeap="true"
android:name="com.example.App"
android:icon="@drawable/icon"
android:label="@string/app_alias"
android:theme="@style/AppTheme" >
答案 7 :(得分:0)
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
}
});