如何防止双码跑点击快两倍于Android的一个按钮(How to prevent double co

2019-06-25 23:32发布

如果我点击快,我的按钮在我的Android应用程序,现在看来,这背后的代码运行两次。 如果我点击我的菜单按钮,必须的onclick开始练习两次才刚刚起步两次,我不得不从它退出两次。

这实在是烦人,因为如果我点击太快,菜单按钮可以装入了一大堆的活动在后台,我必须用一个退出他们一个,所以这显然是我的应用程序的越野车的状态,我想解决这个问题。

我可以做这个问题呢?

我用简单的onClickListeners和按钮

编辑:

关于对答案和评论我的菜单按钮看起来是这样的:

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();

    }
});

所有这些修正它仍然是相同的后:■当我点击像一个疯狂的人多activites是历史堆栈上,我必须退出多次。

有什么建议 ? 什么MI做错了什么?

Answer 1:

您可以使用下面的代码:btn.setEnabled(假);

btn.setOnclickListener(new View.onClickListener(){

      public void onClick(View v) {
            btn.setEnabled(false);

      }
});


Answer 2:

您可以暂时禁用的观点是这样

public static void disableTemporarly(final View view) {

        view.setEnabled(false);
        view.post(new Runnable() {
            @Override
            public void run() {

                view.setEnabled(true);
            }
        });
    }

编辑:

上述解决方案将正常工作。 但是,使用科特林的功率时,它会变得更好

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)
    }
}

2)添加扩展功能,使其可与任何看法,这将创建一个新的SafeClickListener和工作委托给它

fun View.setSafeOnClickListener(onSafeClick: (View) -> Unit) {

    val safeClickListener = SafeClickListener {
        onSafeClick(it)
    }
    setOnClickListener(safeClickListener)
}

3)现在是非常容易使用它

settingsButton.setSafeOnClickListener {
    showSettingsScreen()
}

快乐科特林;)



Answer 3:

嗯,这是预期的行为...

启动与SINGLE_TOP标志新acvitity

或尝试设置android:launchMode="singleInstance"的TOP20活动的AndroidManifest.xml



Answer 4:

这解决了活动的多个实例的问题,仍然发挥默认的动画

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);


Answer 5:

该解决方案更适合的我的要求。 而不是使用启用/禁用视图功能。 我用的时候,第一,创建一个变量来存储上一次用户按下看法*那么当用户按下视图,拍摄时间在一个变量,以比较当前时刻和最后一次用户按下的观点,如果时间之间的时间差太小,这意味着快,或速度极快只是忽略它,就是这样。 但是,如果在合理的时间给你,设定与当前时间的最后时间变量,做你想做的任何事情。

@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 6:

下面的一小段代码片段加入到在AndroidManifest.xml您的活动定义

android:launchMode = "singleTask"


Answer 7:

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" >


Answer 8:

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


文章来源: How to prevent double code running by clicking twice fast to a button in Android