如果我点击快,我的按钮在我的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做错了什么?
您可以使用下面的代码:btn.setEnabled(假);
btn.setOnclickListener(new View.onClickListener(){
public void onClick(View v) {
btn.setEnabled(false);
}
});
您可以暂时禁用的观点是这样
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()
}
快乐科特林;)
嗯,这是预期的行为...
启动与SINGLE_TOP标志新acvitity
或尝试设置android:launchMode="singleInstance"
的TOP20活动的AndroidManifest.xml
这解决了活动的多个实例的问题,仍然发挥默认的动画
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
该解决方案更适合的我的要求。 而不是使用启用/禁用视图功能。 我用的时候,第一,创建一个变量来存储上一次用户按下看法*那么当用户按下视图,拍摄时间在一个变量,以比较当前时刻和最后一次用户按下的观点,如果时间之间的时间差太小,这意味着快,或速度极快只是忽略它,就是这样。 但是,如果在合理的时间给你,设定与当前时间的最后时间变量,做你想做的任何事情。
@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!");
}
}
我看到了类似的答案上的其他职位,但似乎没有人喜欢这种方式。
下面的一小段代码片段加入到在AndroidManifest.xml您的活动定义
android:launchMode = "singleTask"
用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" >
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