Я предоставляю пользователям обратную связь через Toast перед переключением фрагментов в моем приложении. Как только появляется Тост, он никогда не очищается. Выход из операции или уничтожение всего этого - единственный способ очистить Тост.Тосты никогда не очищаются, когда я обмениваю фрагменты
Я попытался провести ссылку на тост и отменить cancel() после совершения FragmentTransaction, но когда я это сделаю, Toast никогда не появляется вообще.
Я добавил регистрацию и уверен, что тост отображается только один раз, а не в цикле или несколько раз. Приложение по-прежнему реагирует в противном случае и не висит. Когда я выхожу из приложения, Toast очищается благодаря функции cancel() в onStop().
public final class MyActivity extends SherlockFragmentActivity {
Toast toast = null;
//...
@Override
protected void onStop() {
if (toast != null) toast.cancel();
toast = null;
super.onStop();
}
//...
private final class MyServiceReceiver extends ResultReceiver {
public MyServiceReceiver(Handler handler) {
super(handler);
}
@Override
protected void onReceiveResult(int resultCode, Bundle resultData) {
if (resultCode == MY_ERROR_CODE) {
toast = Toast.makeText(getApplicationContext(), "my error message", Toast.LENGTH_SHORT);
toast.show();
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out,
android.R.anim.fade_in, android.R.anim.fade_out);
ft.replace(R.id.main_layout, new MyFragment());
ft.commit();
//if (toast != null) toast.cancel();
//toast = null;
}
}
}
}
Я думал, что желательно быть привязанным к контексту приложения? Поскольку деятельность может выйти после представления тоста. 'this' не является Activity, поскольку этот тост показан в классе ResultReceiver. Я попытался переместить содержимое ResultReciever в другой метод, где я мог бы получить доступ к 'this', но результат тот же. Тост появляется и никогда не уходит. –
Я вижу, что Toast находится под вашим внутренним классом MyServiceReceiver, вам не нужно перемещать свой код, чтобы использовать его, можете использовать Toast.makeText (MyActivity.this, «мое сообщение об ошибке», Toast.LENGTH_SHORT) .show() , Что еще более важно, убедитесь, что ваш тост не вызывается несколько раз. Дайте мне знать, если это сработает для вас. – Ethan
Спасибо, у меня есть кое-что, чтобы узнать о Java. Использование контекста Activity по-прежнему не устраняет проблему. ResultReceiver вызывается из IntentService, так что он находится в потоке, отличном от UI, и [теперь я вижу, что Toasts должен быть создан из потока пользовательского интерфейса] (http://stackoverflow.com/questions/12407910/android-toast- из-intentservice-остается-на-экране-на-никогда? LQ = 1). –