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

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

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




Начать новую тему Ответить на тему  [ Сообщений: 11 ] 
Автор Сообщение
СообщениеДобавлено: 15 мар 2013, 19:08 
Аватар пользователя

Зарегистрирован: 26 июл 2012, 10:42
Сообщений: 712
Благодарил (а): 6 раз.
Поблагодарили: 18 раз.
При выполнении долгих операций, к примеру при прохождении авторизации пользователем, зачастую для отображения хода операции мы отображаем ProgressDialog. Но в это время пользователь может вертеть устройство в разных направлениях, что вызовет смену ориентации экрана и вызовет процедуру пересоздания Активити, чтоб от этого застраховаться, я создал следующий вспомогательный класс:
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. public class elProgressDialogOrientationBlock extends ProgressDialog {
  2.        
  3.         /*
  4.          * Прогресс диалог запрещающий поворот экрана при его работе
  5.          */
  6.        
  7.         private Context mContext;
  8.         private int mOrientation = ActivityInfo.SCREEN_ORIENTATION_SENSOR;
  9.  
  10.         public elProgressDialogOrientationBlock(Context context) {
  11.             super(context);
  12.             mContext = context;
  13.         }
  14.  
  15.         public elProgressDialogOrientationBlock(Context context, int theme) {
  16.             super(context, theme);
  17.             mContext = context;
  18.         }
  19.  
  20.         @Override
  21.         public void show() {
  22.                 // Запоминаем ориентацию экрана
  23.                 mOrientation = ((Activity) mContext).getRequestedOrientation();
  24.             // Блокируем ориентацию экрана на время работы диалога.
  25.             switch (((WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getRotation()) {
  26.                 case Surface.ROTATION_90:
  27.                         ((Activity) mContext).setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
  28.                     break;
  29.                 case Surface.ROTATION_180:
  30.                         ((Activity) mContext).setRequestedOrientation(9/* reversePortait */);
  31.                     break;          
  32.                 case Surface.ROTATION_270:
  33.                         ((Activity) mContext).setRequestedOrientation(8/* reverseLandscape */);
  34.                     break;
  35.                 default :
  36.                         ((Activity) mContext).setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
  37.             }
  38.                
  39.             super.show();
  40.         }
  41.        
  42.  
  43.         @Override
  44.         public void dismiss() {
  45.             super.dismiss();
  46.             // Восстанавливаем ориентацию экрана
  47.             ((Activity) mContext).setRequestedOrientation(mOrientation);
  48.             //((Activity) mContext).setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
  49.         }
  50.        
  51.  
  52. }

Выкладываю тут, возможно кому ещё пригодится. :roll:


Последний раз редактировалось neoksi 15 мар 2013, 21:37, всего редактировалось 1 раз.

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

Зарегистрирован: 17 фев 2012, 21:23
Сообщений: 1339
Откуда: Мордор
Благодарил (а): 16 раз.
Поблагодарили: 161 раз.
Меня одна вещь беспокоит. Что если до показа диалога ориентация была не SCREEN_ORIENTATION_SENSOR?
Может стоит запоминать текущую ориентацию перед блокировкой, а потом восстанавливать ее?

_________________
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.


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

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

Хорошее замечание :) , я даже как-то не подумал об этом, дополнил код выше.


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

Зарегистрирован: 20 окт 2012, 12:01
Сообщений: 4201
Благодарил (а): 68 раз.
Поблагодарили: 467 раз.
ух ты, мне надо! Спасибо!

_________________
R.id.team

NullPointerException - что делать???
http://forum.startandroid.ru/viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
http://forum.startandroid.ru/viewtopic.php?f=60&t=3198


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

Зарегистрирован: 26 июн 2012, 13:22
Сообщений: 3422
Откуда: UA
Благодарил (а): 11 раз.
Поблагодарили: 244 раз.
а не проще запретить перерисовку при поворотах?

_________________
R.id.team
Политика на форуме запрещена


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

Зарегистрирован: 26 июл 2012, 10:42
Сообщений: 712
Благодарил (а): 6 раз.
Поблагодарили: 18 раз.
rezak90 писал(а):
а не проще запретить перерисовку при поворотах?

И перерисовывать вручную?

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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 16 мар 2013, 16:03 
Аватар пользователя

Зарегистрирован: 26 июн 2012, 13:22
Сообщений: 3422
Откуда: UA
Благодарил (а): 11 раз.
Поблагодарили: 244 раз.
я имел в виду запретить перерисовку активити в манифесте и в фрагменте

_________________
R.id.team
Политика на форуме запрещена


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 16 мар 2013, 16:50 
Аватар пользователя

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

Это тоже вариант, но он ущемляет юзабильность приложения. К примеру я обычно использую приложения на смартфонах в портретном режиме, но когда мне необходимо ввести текст, то я переворачиваю телефон в альбомный режим, так как там у клавиатуры большие кнопки. Если запретить в переворот приложения, то мне станет неудобно им пользоваться, в результате я просто найду другое приложение с аналогичным функционалом. :)


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 28 апр 2013, 23:30 
Аватар пользователя

Зарегистрирован: 26 июл 2012, 10:42
Сообщений: 712
Благодарил (а): 6 раз.
Поблагодарили: 18 раз.
Столкнулся с проблемой на планшетах, код пришлось менять, так как на них ориентация считается иначе.
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. public class elProgressDialogOrientationBlock extends ProgressDialog { 
  2.        
  3.        
  4.         private Context mContext;
  5.         private int mOrientation = ActivityInfo.SCREEN_ORIENTATION_SENSOR;
  6.  
  7.         public elProgressDialogOrientationBlock(Context context) {
  8.             super(context);
  9.             mContext = context;
  10.         }
  11.  
  12.         public elProgressDialogOrientationBlock(Context context, int theme) {
  13.             super(context, theme);
  14.             mContext = context;
  15.         }
  16.  
  17.         @Override
  18.         public void show() {
  19.                 // Запоминаем ориентацию экрана
  20.                 mOrientation = ((Activity) mContext).getRequestedOrientation();
  21.             // Блокируем ориентацию экрана на время работы диалога.
  22.                 /*
  23.             switch (((WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getRotation()) {
  24.                     case Surface.ROTATION_0:
  25.                         ((Activity) mContext).setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
  26.                     break;
  27.                 case Surface.ROTATION_90:
  28.                         ((Activity) mContext).setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
  29.                     break;
  30.                 case Surface.ROTATION_180:
  31.                         ((Activity) mContext).setRequestedOrientation(9);// reversePortait
  32.                     break;          
  33.                 case Surface.ROTATION_270:
  34.                         ((Activity) mContext).setRequestedOrientation(8);// reverseLandscape
  35.                     break;
  36.                 default :
  37.                         ((Activity) mContext).setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
  38.             }
  39.                 */
  40.                
  41.                 ((Activity) mContext).setRequestedOrientation(getCurentOrientation());
  42.                
  43.             super.show();
  44.         }
  45.        
  46.         @SuppressWarnings("deprecation")
  47.         private int getCurentOrientation() {
  48.             Display d = ((WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
  49.            
  50.             final Point point = new Point();
  51.             try {
  52.                 d.getSize(point);
  53.             } catch (java.lang.NoSuchMethodError ignore) { // Older device
  54.                 point.x = d.getWidth();
  55.                 point.y = d.getHeight();
  56.             }
  57.            
  58.             boolean isWide = point.x >= point.y;
  59.            
  60.             switch (d.getRotation()) {
  61.             case Surface.ROTATION_0:
  62.                 return isWide ? ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
  63.                         : ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
  64.             case Surface.ROTATION_90:
  65.                 return isWide ? ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
  66.                         : 9;
  67.             case Surface.ROTATION_180:
  68.                 return isWide ? 8
  69.                         : 9;
  70.             case Surface.ROTATION_270:
  71.                 return isWide ? 8
  72.                         : ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
  73.             }
  74.             return -1;
  75.         }
  76.        
  77.  
  78.         @Override
  79.         public void dismiss() {  
  80.                 super.dismiss();
  81.             // Восстанавливаем ориентацию экрана
  82.                 try{
  83.                         ((Activity) mContext).setRequestedOrientation(mOrientation);
  84.                 }catch (Exception e) {
  85.                         // Ничего не делаем.
  86.                 }
  87.         }
  88.        
  89.  
  90. }


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

Зарегистрирован: 26 июн 2012, 13:22
Сообщений: 3422
Откуда: UA
Благодарил (а): 11 раз.
Поблагодарили: 244 раз.
пересмотрел все сообщения в данной теме, сразу задался вопросом: в чём проблема? диалог показали и при повороте он никуда не денется он уже существует и сам перерисуется как ему нужно, или я что то упустил?

_________________
R.id.team
Политика на форуме запрещена


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

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

Это сам диалог, а AsyncTask который к нему привязан и который запускает пользователь, а не программа? =)

Я этот диалог использую в одном случае, при логине пользователя в программу.


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

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


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

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