2013-06-01 1 views
0

Я предоставляю пользователям обратную связь через 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; 
      } 
     } 

    } 

} 

ответ

0

Проблема заключается в том, что IntentService вызывает ResultReceiver, поэтому Toast создается из потока пользовательского интерфейса. See this post.

Чтобы решить, я создаю обработчик для Activity и сделаю тосты там. В качестве бонуса, похоже, мне не нужно управлять ссылкой на Toast и очищать Activity.onStop.

0

Вы передаете контекст приложения на свой тост, точный жизненный цикл свяжется с контекстом вашего приложения. Вы должны перейти в свою текущую деятельность.

toast = Toast.makeText (это сообщение "my error message", Toast.LENGTH_SHORT);

toast.show();

+0

Я думал, что желательно быть привязанным к контексту приложения? Поскольку деятельность может выйти после представления тоста. 'this' не является Activity, поскольку этот тост показан в классе ResultReceiver. Я попытался переместить содержимое ResultReciever в другой метод, где я мог бы получить доступ к 'this', но результат тот же. Тост появляется и никогда не уходит. –

+0

Я вижу, что Toast находится под вашим внутренним классом MyServiceReceiver, вам не нужно перемещать свой код, чтобы использовать его, можете использовать Toast.makeText (MyActivity.this, «мое сообщение об ошибке», Toast.LENGTH_SHORT) .show() , Что еще более важно, убедитесь, что ваш тост не вызывается несколько раз. Дайте мне знать, если это сработает для вас. – Ethan

+0

Спасибо, у меня есть кое-что, чтобы узнать о Java. Использование контекста Activity по-прежнему не устраняет проблему. ResultReceiver вызывается из IntentService, так что он находится в потоке, отличном от UI, и [теперь я вижу, что Toasts должен быть создан из потока пользовательского интерфейса] (http://stackoverflow.com/questions/12407910/android-toast- из-intentservice-остается-на-экране-на-никогда? LQ = 1). –