如何通过在Android中快速单击两次按钮来防止双码运行

时间:2012-07-02 09:00:28

标签: android android-button

如果我在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 当我像疯子一样点击时,多个活动在历史堆栈上,我必须多次退出。

有什么建议吗?我做错了什么?

8 个答案:

答案 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
    }
 });