- Повороты экрана в Android без боли
- Предисловие
- Когда начались проблемы?
- Возможное решение
- Да начнется магия
- Реализация приложения
- 5 лучших приложений для управления поворотом экрана на Android-устройстве
- Принудительный переворот экрана андроид
- Ultimate Rotation Control 6.3.5 (Google)
- Управляем положением экрана Android без ограничений — Rotation Control
Повороты экрана в Android без боли
Важно!
Изначально в статье была реализация с ошибкой. Ошибку исправил, статью немного поправил.
Предисловие
Истинное понимание проблем каждой платформы приходит после того, как попробуешь писать под другую платформу / на другом языке. И вот как раз после того, как я познакомился с разработкой под iOS, я задумался над тем, насколько ужасна реализация поворотов экрана в Android. С того момента я думал над решением данной проблемы. Попутно я начал использовать реактивное программирование везде, где только можно и уже даже не представляю как писать приложения по-другому.
И вот я узнал про последнюю недостающую деталь — Data Binding. Как-то эта библиотека прошла мимо меня в свое время, да и все статьи, что я читал (что на русском, что на английском) рассказывали не совсем про то, что мне было необходимо. И вот сейчас я хочу рассказать про реализацию приложения, когда можно будет забыть про повороты экранов вообще, все данные будут сохраняться без нашего прямого вмешательства для каждого активити.
Когда начались проблемы?
По настоящему остро я почувствовал проблему, когда в одном проекте у меня получился экран на 1500 строк xml, по дизайну и ТЗ там было целая куча различных полей, которые становились видимыми при разных условиях. Получилось 15 различных layout’ов, каждый из которых мог быть видимым или нет. Плюс к этому была еще куча различных объектов, значения которых влияют на вьюху. Можете представить уровень проблем в момент поворота экрана.
Возможное решение
Сразу оговорюсь, я против фанатичного следования заветам какого-либо подхода, я пытаюсь делать универсальные и надежные решения, несмотря на то, как это смотрится с точки зрения какого-либо паттерна.
Я назову это реактивным MVVM. Абсолютно любой экран можно представить в виде объекта: TextView — параметр String, видимость объекта или ProgressBar’а — параметр Boolean и т.д… А так же абсолютно любое действие можно представить в виде Observable: нажатие кнопки, ввод текста в EditText и т.п…
Вот тут я советую остановиться и прочитать несколько статей про Data Binding, если еще не знакомы с этой библиотекой, благо, на хабре их полно.
Да начнется магия
Перед тем как начать создавать нашу активити, создадим базовые классы для активити и ViewModel’ли, где и будет происходить вся магия.
Update!
После общения в комментариях, осознал свою ошибку. Суть в том, что в моей первой реализации ничего не сериализуется, но все работает при поворотах экрана, да даже при сворачивании, разворачивании экрана. В комментариях ниже обязательно почитайте почему так происходит. Ну а я исправлю код и поправлю комментарии к нему.
Для начала, напишем базовую ViewModel:
Я уже говорил, что все что угодно можно представить как Observable? И библиотека RxBinding отлично это делает, но вот беда, мы работает не напрямую с объектами, типа EditText, а с параметрами типа ObservableField. Что бы радоваться жизни и дальше, нам необходимо написать функцию, которая будет делать из ObservableField необходимый нам Observable RxJava2:
Тут все просто, передаем на вход ObservableField и получаем Observable RxJava2. Именно для этого мы наследуем базовый класс от BaseObservable. Добавим этот метод в наш базовый класс.
Теперь напишем базовый класс для активити:
Я постарался подробно прокомментировать код, но заострю внимание на нескольких вещах.
Активити, при повороте экрана всегда уничтожается. Тогда, при восстановлении снова вызывается метод onCreate. Вот как раз в методе onCreate нам и нужно восстанавливать данные, предварительно проверив, сохраняли ли мы какие-либо данные. Сохранение данных происходит в методе onSaveInstanceState.
При повороте экрана нас интересует порядок вызовов методов, а он такой (то, что интересует нас):
1) onDestroy
2) onSaveInstanceState
Что бы не сохранять уже не нужные данные мы добавили проверку:
Дело в том, что метод isFinishing вернет true только если мы явно вызвали метод finish() в активити, либо же ОС сама уничтожила активити из-за нехватки памяти. В этих случаях нам нет необходимости сохранять данные.
Реализация приложения
Представим условную задачу: нам необходимо сделать экран, где будет 1 EditText, 1 TextView и 1 кнопка. Кнопка не должна быть кликабельной до тех пор, пока пользователь не введет в EditText цифру 7. Сама же кнопка будет считать количество нажатий на нее, отображая их через TextView.
Update!
Пишем нашу ViewModel:
Update
Вот тут и и были самые большие проблемы. Все работало и при старой реализации, ровно до того момента, пока в настройках разработчика не включить параметр «Don’t keep activities».
Что бы все работало как надо, необходимо реализовывать интерфейс Parcelable для ViewModel. По поводу реализации ничего писать не буду, только уточню еще 1 момент:
Данные-то мы возвращаем, а вот Observable мы теряем. Поэтому пришлось выводить в отдельный метод и вызывать его во всех конструкторах. Это очень быстрое решение проблемы, не было времени подумать лучше, нужно было было указать на ошибку. Если у кого-то есть идеи как реализовать это лучше, пожалуйста, поделитесь.
Теперь напишем для этой модели view:
Ну и теперь, мы пишем нашу активити:
Запускаем приложение. Кнопка не кликабельна, счетчик показывает 0. Вводим цифру 7, вертим телефон как хотим, через 2 секунды, в любом случае кнопка становится активной, тыкаем на кнопку и счетчик растет. Стираем цифру, вертим телефоном снова — кнопка все равно через 2 секунды будет не кликабельна, а счетчик не сбросится.
Все, мы получили реализацию безболезненного поворота экрана без потери данных. При этом будут сохранены не только ObservableField и тому подобные, но так же и объекты, массивы и простые параметры, типа int.
Источник
5 лучших приложений для управления поворотом экрана на Android-устройстве
Функция смены ориентации экрана на Android не всегда работает так, как хочется пользователю — некоторые приложения не переворачиваются, а другие, напротив, переходят из портретного режима в ландшафтный и наоборот в самый неподходящий момент. К счастью, на Android есть приложения, которые позволяют настроить, в каких случая ориентация будет меняться, а в каких нет.
Это приложение добавляет в настройки ориентации несколько новых опций и позволяет перевернуть любое приложение, даже если оно изначально не поддерживает смену режима отображения. Кроме того, оно позволяет обходить стандартные настройки поворота экрана и запрещать приложениям менять интерфейс.
Rotation Manager позволяет выбрать, в какой ориентации экрана будет работать то или иное приложение: ландшафтной, портретной или по выбору системы (в том числе в зависимости от того, как вы держите устройство). Приложение постоянно работает в фоновом режиме, однако, по словам разработчиков, почти не потребляет оперативную память.
Orientation Manager более бережно относится к системным ресурсам — вы можете запретить этому приложению запускаться с загрузкой операционной системы. Когда оно запущено, на экране появляется миниатюрная кнопка, нажатие на которую позволяет форсированно изменить ориентацию любого запущенного приложения. Цвет кнопки можно выбрать в настройках.
С помощью Rotation Control можно запретить выбранным приложениям менять ориентацию интерфейса, активировать авто-поворот, при котором ориентация меняется в зависимости от того, как вы держите устройство, или зафиксировать определенную ориентацию: только портретная или только ландшафтная.
Screen Rotation Controller уведомляет вас, когда какое-либо приложение пытается сменить ориентацию экрана и позволяет разрешить или запретить ему сделать это. Кроме того, с его помощью вы можете форсированно поменять ориентацию любого приложения вручную.
Источник
Принудительный переворот экрана андроид
Наиболее понятный и настраиваемый менеджер ориентаций экранов устройств для Android. Позволяет снимать Full Control ориентации настроек устройства. Вращение по требованию позволяет выбрать поворот экрана на лету без необходимости переключения в приложение в первую очередь. Программа предлагает все режимы, которые поддерживает Android, и вы можете также переопределить каждый в настройках приложения, чтобы повернуть в соответствии с вашими потребностями. Приложение имеет встроенный учебник (в том числе на русском языке).
Языки:
— Английский, немецкий, французский, турецкий, китайский (упрощенный)
Поддерживаемые режимы:
Режимы системы по умолчанию
* Авто-поворот Вкл
* Автоповорот Off
Другие режимы переопределяют настройки системы
* Принудительный автоматический поворот
* Принудительный Портрет
* Принудительный Пейзаж
* Обратный Портрет
* Обратный Пейзаж
* Датчик Пейзаж
* Принудительный «Полный Датчик»
Блокировка:
— Блокировка текущей ориентации
Настройки приложения:
* Указана ориентация для отдельных приложений
* Указан Экран блокировки, Телефонный звонок, зарядки, гарнитуры и док ориентации
Поворот по требованию:
* Плавающий пузырь: — полностью настраиваемый «пузырь» остается на вершине каждого приложения, чтобы изменить ориентацию приложения
* Быстрый уведомление: — Изменение ориентации переднего плана приложение от уведомления
Уведомления:
* Включить для бесперебойной работы
* Выбор действия по нажатию
* Добавить быстрый переключатель изменения ориентации
Виджеты:
* Полностью настраиваемый с экрана блокировки поддержки (Android 4.2.2+)
* Сервис виджет: Переключить службы
* Режим виджет: Переключение между двумя выбранными режимами
* Динамическое виджет: Добавляет переключение в соответствии с вашими потребностями
Пользовательский интерфейс:
* Светлые и темные базовые темы
* Настройка цвета с помощью Rotation тематических акцентов. Поддержка тематических акцентов Xperia ™
* Выберите один из двух наборов значков по умолчанию и в перевернутом стиле
Другие особенности:
* Вращение Автоматизация: — Tasker / Locale поддержка плагинов для автоматизации более 20 действий
* Вращение Ярлыки: — Добавить полностью настраиваемые горячие на главный экран
* Начните при загрузке: — Запустить сервис вращения при загрузке
* Вибрация: — Для уведомления, когда ориентация экрана меняется с настраиваемым длиной вибрации
* Помощь и информация: — Подробная информация о режимах ориентации и легко понять Учебник
* Опция удаления в приложение
В встроенная поддержка: —
* Резервное копирование и восстановление
* Сброс настроек в приложение
* Перезапустить программу, если она не ведет себя должным образом
ВНИМАНИЕ:
— Нет рекламы
— Не требуется интернет разрешение
— Это приложение не требует прав суперпользователя.
— Некоторые приложения могут не отображаться правильно, когда вынуждены работать в режиме книжная / альбомная. Используйте Автоповорот On / Off в настройках приложения использовать системные настройки для этих приложений.
Key 2021: Rotation — Orientation Manager (Пост Katafrakt #102554915)
Key: Rotation+Key+v3.0.apk ( 25.36 КБ )
Источник
Ultimate Rotation Control 6.3.5 (Google)
Программа для поворота экрана в приложениях.
Каждый из Вас попадал в ситуацию, когда в том или ином приложении или случае нужно было повернуть экран под определенный градус, но ввиду того, что встроенным поворотом этого сделать было нельзя, С Ultimate Rotation Control наконец то это стало возможно.
Полный контроль ориентации экрана. Блокировка всех поворотов. Единственное приложение контроля количества оборотов, которое действительно может заблокировать экран в любом направлении, а также заставить автоматически повернуть экран в приложениях для конкретных условий.
★ Принудительный автоматический поворот
★ «В настройки» программы
★ Виджет и уведомление в строке состояния с ярлыком, кнопки для легкого изменения вращения экрана
★ Возможность создавать ярлыки для конкретных режимов
★ Оптимизирован для Android 1.6 (Donut) все пути к Android 4.1 (Jelly Bean)
★ Может действовать как таскер/Плагин для автоматизации настройки ориентации экрана
Источник
Управляем положением экрана Android без ограничений — Rotation Control
Наверняка каждый активный пользователь Android’а сталкивался с определенными неудобствами, когда, то или иное приложение не позволяет изменить ориентацию экрана устройства, а при выходе из строя датчика положения, эта функция и вовсе, становится недоступной без визита в сервисный центр с последующим дорогостоящим ремонтом.
Избавиться от всех этих проблем и сделать управление Android устройством еще более комфортным поможет программа Rotation Control . Приложение позволяет поворачивать экран в любом нужном пользователю направлении : заблокировать положение, чтобы избежать нежелательных поворотов при просмотре видео, адаптировать экран под нестандартные программы или сохранить ориентацию при запущенной игре. Примеров можно привести очень много ( но самый распространенный — это когда производитель вашего планшета «забыл» про одну из сторон ориентации, из-за чего нельзя одновременно смотреть фильм и заряжать устройство , пример см. на фото ).
При неисправном датчике движения на устройстве, Rotation Control станет прекрасной альтернативой походу в сервисный центр.
Интерфейс приложения крайне прост и будет понятен любому, даже не опытному пользователю операционной системы Android. С помощью внутренних настроек программу можно добавить в автозагрузку, для ее быстрого запуска закрепить в панели уведомлений, поменять ориентацию экрана из под любого приложения буквально одним свайпом.
Еще одно достоинство Rotation Control — это малый размер программы, что немаловажно для владельцев бюджетных устройств и почти никакой объем занимаемой оперативной памяти.
Rotation Control работает на любых устройствах под управлением ОС Android 4.1 и выше.
Источник