3

假设你有一个Button,每当你点击它时,它就会显示一个Toast带有“ Hello ”的消息。如果您决定重复单击该Button20 次,则Toasts 将异步显示,等待每个轮到它。然而,这并不是我真正想要的。

我想要的是以下内容:每当我按下 时Button,我希望它取消先前显示Toast的并显示实际的。因此,当我关闭应用程序时,如果用户决定在很短Toast的时间内通过单击 100 次来弄乱应用程序,则不会显示任何 s 。Button

4

2 回答 2

6

您需要在类级别声明您的 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.....;
            }

        });
    }

}
于 2013-03-28T23:33:51.403 回答
0

这是另一个解决方案。如果您只想防止显示多个 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的信息。

于 2013-03-29T00:04:16.677 回答