Отключить асинхронное отображение тоста
Предположим, что у вас есть Button
что всякий раз, когда вы нажимаете на него, он отображает Toast
с сообщением "Привет". Если вы решили нажать на это Button
20 раз, Toast
s будет отображаться асинхронно, ожидая каждого своего хода. Однако это не то, чего я действительно хочу.
То, что я хочу, это следующее: всякий раз, когда я нажимаю Button
Хочу отменить предыдущее Toast
и отобразить фактический. Так что когда я закрываю приложение, нет Toast
s будет отображаться, если пользователь решит связываться с приложением, нажав на 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.