Отключить асинхронное отображение тоста

Предположим, что у вас есть Button что всякий раз, когда вы нажимаете на него, он отображает Toast с сообщением "Привет". Если вы решили нажать на это Button 20 раз, Toasts будет отображаться асинхронно, ожидая каждого своего хода. Однако это не то, чего я действительно хочу.

То, что я хочу, это следующее: всякий раз, когда я нажимаю ButtonХочу отменить предыдущее Toast и отобразить фактический. Так что когда я закрываю приложение, нет Toasts будет отображаться, если пользователь решит связываться с приложением, нажав на Button 100 раз за очень маленький период.

2 ответа

Решение

Вам нужно объявить свой Toast на уровне класса, а затем вызвать toast.cancel() перед созданием нового объекта Toast и его показом.

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

        });
    }

}

Вот другое решение. Если все, что вам нужно, это запретить отображение нескольких тостов для быстрых кликов, то комбинация 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.

Другие вопросы по тегам