禁用Toast的异步显示

时间:2013-03-28 23:31:31

标签: android

假设您有Button,只要您点击它,它就会显示Toast,并显示消息“ Hello ”。 如果您决定重复点击Button 20次,Toast将异步显示,轮流等待每个Button。但是,这不是我真正想要的。

我想要的是以下内容: 每当我按下Toast时,我希望它取消之前显示的Toast并显示实际的Button。因此,当我关闭应用时,如果用户决定在很短的时间内点击{{1}} 100次,就不会显示{{1}}。

2 个答案:

答案 0 :(得分: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.....;
            }

        });
    }

}

答案 1 :(得分: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