Google Android - это несложно • Просмотр темы - Разное поведение Toast в Андроид 2 и 4

Google Android - это несложно

Добро пожаловать на форум сайта startandroid.ru
Текущее время: 20 авг 2018, 00:00

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
СообщениеДобавлено: 21 май 2013, 00:41 
Аватар пользователя

Зарегистрирован: 26 июл 2012, 10:42
Сообщений: 712
Благодарил (а): 6 раз.
Поблагодарили: 18 раз.
Задача:
Отображать один текущий Toast, который отражает текущее состояние выполняемой операции приложением.

Решение:
Создание BroadcastReceiver'а, который принимает сообщение и генерирует Toast, а так же следит за тем, чтоб в Toast отображался текст именно текущего сообщения.

Проблемы:
Если мы будем просто генерировать при получении сообщения новый Toast, то он встанет в очередь и отобразиться только после окончания времени показа предыдущего Toast. В результате операция будет выполнена, а пользователю будут отображаться Toast, что в принципе будет вводить его в заблуждение, о времени выполнения операции приложением. Исходя из этого, при получении нового сообщения, нам необходимо проверить, отображается в данный момент ли Toast, если да, то закрыть его и бросить новый. Для Андроида до версии 4 решение выгляди следующим образом:
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1.                                         if(vToast==null) vToast = Toast.makeText(ctx, "", Toast.LENGTH_SHORT);
  2.                                         vToast.cancel();
  3.                                         vToast.setText(sMsg);
  4.                                         vToast.show();

Но в Андроид версии 4 и выше, что-то поменяли и после вызова vToast.cancel(); Toast не будет отображен по вызову vToast.show();. В результате до 4 версии андроида будут отображаться всплывающие сообщения, а начиная с 4 версии код будет работать, но сообщений пользователь не увидит. И это проявление можно увидеть только на реальных девайсах, в эмуляторе будет все ок. после нескольких экспериментов на реальных устройствах у меня получилось отработать это изменения поведения в моём BroadcastReceiver'е.

Готовый код ресивера:
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. public class BroadcastReceiverSyncMsg extends BroadcastReceiver {
  2.        
  3.         private static final boolean IS_ICS_OR_LATER = Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH;
  4.        
  5.         private static Toast vToast;
  6.        
  7.         @Override
  8.         public void onReceive(Context ctx, Intent intent) {
  9.                 if(intent!=null){
  10.                         if(intent.getAction()!=null && intent.getAction().equalsIgnoreCase(IntentKey.KEY_ACTION_SYNC_SEND_MESSAGE)){
  11.                                 String sMsg = intent.getStringExtra(IntentKey.KEY_SYNC_SEND_MESSAGE);
  12.                                 if(sMsg!=null){
  13.                                        
  14.                                         if (IS_ICS_OR_LATER && vToast != null) {
  15.                                                 // Скрываем и обнуляем прошлый Toast в Андроид 4 и выше.
  16.                                                 vToast.cancel();
  17.                                                 vToast=null;
  18.                                     }
  19.                                        
  20.                                         if(vToast==null) vToast = Toast.makeText(ctx, "", Toast.LENGTH_SHORT);
  21.                                         // Скрываем прошлый Toast в Андроид до 4 версии.
  22.                                         if(!IS_ICS_OR_LATER) vToast.cancel();
  23.                                         // Назначаем новый текст Toast и показываем его.
  24.                                         vToast.setText(sMsg);
  25.                                         vToast.show();         
  26.                                 }
  27.                         }
  28.                 }              
  29.         }
  30.  
  31. }


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 29 авг 2013, 14:30 

Зарегистрирован: 16 июн 2013, 11:18
Сообщений: 18
Благодарил (а): 4 раз.
Поблагодарили: 0 раз.
Не работает ваше решение. Что такое INTENTKEY?


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 29 авг 2013, 17:15 
Аватар пользователя

Зарегистрирован: 26 июл 2012, 10:42
Сообщений: 712
Благодарил (а): 6 раз.
Поблагодарили: 18 раз.
9bagel писал(а):
Не работает ваше решение. Что такое INTENTKEY?

Ну если тупо копи-пастить, то конечно не сработает, так это конкретное решение из моей программы.
IntentKey- это мой класс, в котором есть константы KEY_ACTION_SYNC_SEND_MESSAGE и KEY_SYNC_SEND_MESSAGE.


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

Часовой пояс: UTC + 3 часа


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB