假设你有一个Button
,每当你点击它时,它就会显示一个Toast
带有“ Hello ”的消息。如果您决定重复单击该Button
20 次,则Toast
s 将异步显示,等待每个轮到它。然而,这并不是我真正想要的。
我想要的是以下内容:每当我按下 时Button
,我希望它取消先前显示Toast
的并显示实际的。因此,当我关闭应用程序时,如果用户决定在很短Toast
的时间内通过单击 100 次来弄乱应用程序,则不会显示任何 s 。Button
假设你有一个Button
,每当你点击它时,它就会显示一个Toast
带有“ Hello ”的消息。如果您决定重复单击该Button
20 次,则Toast
s 将异步显示,等待每个轮到它。然而,这并不是我真正想要的。
我想要的是以下内容:每当我按下 时Button
,我希望它取消先前显示Toast
的并显示实际的。因此,当我关闭应用程序时,如果用户决定在很短Toast
的时间内通过单击 100 次来弄乱应用程序,则不会显示任何 s 。Button
您需要在类级别声明您的 Toast,然后在构造新的 Toast 对象并显示它之前调用 toast.cancel()。
public class XYZ extends Activity {
Toast mToast;
public void onCreate(Bundle b) {
.....
button.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
if(mToast != null)
mToast.cancel();
mToast = Toast.makeText.....;
}
});
}
}
这是另一个解决方案。如果您只想防止显示多个 toast 以进行快速点击,那么 AlarmManager 和 PendingIntent 的组合也应该可以工作。现在请记住,我没有对此进行测试,也没有检查它是否可以编译。
AlarmManager mAlarm;
PendingIntent mPendingIntent;
//toast delay for a second
int toastDelay = 1000;
@Override
public void onCreate (Bundle savedInstanceState) {
Intent i = new Intent(context, MySimpleBroadcastReceiver.class);
//optionally set an action
i.setAction("show:toast");
mPendingIntent = PendingIntent.getBroadcast(context, 0, i, PendingIntent.FLAG_CANCEL_CURRENT);
mAlarm = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
}
public void onClick(View v) {
//set the alarm to trigger 1 second from current time
mAlarm.set(AlarmManager.RTC_WAKEUP, (System.currentTimeMillis() + toastDelay), mPendingIntent);
}
@Override
protected void onDestroy () {
if (mAlarm != null) {
mAlarm.cancel(mPendingIntent);
}
mAlarm = null;
mPendingIntent = null;
}
创建广播接收器并记住将其添加到您的 AndroidManifest.xml 中:
public class MySimpleBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive (Context context, Intent intent) {
//optionally check the action that triggered the broadcast..useful if you want to use this broadcast for other actions
if (intent.getAction().equals("show:toast")) {
Toast.makeText(context, "Hello", Toast.LENGTH_SHORT).show();
}
}
}
您可以阅读有关PendingIntent.FLAG_CANCEL_CURRENT的信息。