- Повороты экрана в Android без боли
- Предисловие
- Когда начались проблемы?
- Возможное решение
- Да начнется магия
- Реализация приложения
- Как включить или выключить поворот экрана на Андроид
- Автоповорот отключен
- Приложения для управления поворотами дисплея и калибровки акселерометра
- Сбой в работе системы
- В каких случаях он действительно полезен
- Проблемы с прошивкой
- Как включить поворот экрана на Андроиде
- Нарушение калибровки
- Дополнительные возможности
- Программные настройки
- За счет чего работает автоповорот экрана
Повороты экрана в 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.
Источник
Как включить или выключить поворот экрана на Андроид
Автоматический поворот экрана — функция, присущая большинству устройств на Андроид. Есть большое количество пользователей, которые не представляют работы со смартфоном или планшетом без этой функции, но есть и те, кто её не любит и сразу же отключает на своём гаджете.
Как бы то ни было, стоит знать, как включать или запретить поворот экрана Андроид разными способами. Давайте детальнее остановимся на том, как пользоваться этой функцией, и взвесим все за и против этого инструмента системы.
Несмотря на все плюсы автоповорота экрана, иногда эта функция может мешать пользователю
Автоповорот отключен
Первая и самая банальная причина, по которой не работает автоповорот экрана – отключение функции в настройках телефона. Некоторые пользователи специально отключают автоповорот в настройках, чтобы он не мешал в каких-то определенных ситуациях, но частенько забывают включить его обратно. Также функция может быть отключена случайно, о чем не всегда можно сразу догадаться.
В любом случае решается данная проблема очень быстро и просто, достаточно лишь активировать автоповорот в телефоне, чтобы он вновь заработал. Сделать это можно двумя способами:
- С помощью статус бара. Нужно провести пальцем от верхней части экрана вниз, после чего среди иконок быстрого доступа следует найти ту, на которой будет нарисована рамочка со стрелками или просто круглая стрелочка. На некоторых телефонах иконки имеют подпись, так что это еще более упрощает ситуацию. Все что остается сделать — нажать на соответствующую «кнопочку» и активировать заветную функцию.
- С помощью настроек. Необходимо перейти в настройки телефона, найти там пункт «Дисплей» или «Экран» и зайти туда. В открывшемся подменю, обычно в самом низу, будет пункт с переключателем «Автоповорот экрана». Если переключатель неактивен, то его нужно будет просто включить, чтобы функция заработала.
Приложения для управления поворотами дисплея и калибровки акселерометра
Помимо всего вышеперечисленного, настраивать поворот дисплея и откалибровать акселерометр можно в сторонних приложениях. Подобного ПО немало в Плей Маркет.
Я выделю три приложения: Screen Orientation Control, Rotation — Orientation Manage, Control Screen Rotation. Сначала попробуйте изменить поворот экрана, и если это не помогло, осуществите перекалибровку.
Такие приложения особенно помогут пользователям, чьи гаджеты не имеют возможность калибровки в настройках.
Сбой в работе системы
Вторая причина, из-за чего не работает автоповорот экрана – сбой в работе системы. На самом деле ничего страшного в этом нет, поскольку сбои периодически случаются, и это в общем-то вполне обычное явление. Другое дело, что во время сбоев может нарушаться работоспособность отдельных функций телефона, включая автоповорот.
Исправить данную проблему можно при помощи простой перезагрузки устройства. Есть еще вариант – выключить аппарат полностью, извлечь аккумулятор на несколько минут, после чего все собрать и включить девайс. Как правило, простой перезагрузки бывает вполне достаточно.
В каких случаях он действительно полезен
Автоповорот — удобная функция, помогающая экранному изображению адаптироваться под положение гаджета. Время от времени у пользователей смартфонов возникает необходимость написать текст не в вертикальном режиме, а в горизонтальном. Перевернув устройство на 90 градусов, абонент получает возможность пользоваться более удобным интерфейсом.
В горизонтальном положении обычно просматривают видео, фотографии, читают информацию на сайтах. Ведь любой смартфон — это мини-компьютер, которым пользуются не только для выполнения звонков и написания смс-сообщений. С гаджета можно войти в Телеграм, ВКонтакте, Фейсбук, Твиттер, Инстаграм.
В горизонтальном режиме удобно играть игры. Широкий экран позволяет лучше рассмотреть рисунок, дает возможность полноценно следить за развитием сюжета. В некоторых играх легкий наклон дисплея расценивается как команда. При изменении наклонного угла выполняется определенная функция.
Сенсорный датчик, имеющийся в смартфоне, можно использовать для других целей. Например, в качестве строительного уровня или линейки, определяющей угол наклона. Мгновенный разворот рисунка на дисплее послужит доказательством того, что поверхность не идеально ровная.
Проблемы с прошивкой
Третья причина, из-за которой не работает автоповорот экрана – проблемы с самой прошивкой. Порой сбой в операционной системе может приводить к тому, что неполадки в работе функций приобретают более глобальный характер и вернуть их к прежнему состоянию с помощью перезагрузки просто невозможно.
Помочь в таком случае может либо сброс до заводских настроек, либо полная перепрошивка устройства.
Первый пункт выполняется очень просто, достаточно зайти в настройки и найти там раздел, связанный с памятью и резервным копированием. В этом разделе, как правило, и находится пункт сброса настроек.
Что же касается перепрошивки устройства, то эта процедура уже более тяжелая. Универсального способа перепрошивки, увы, нет, так что стоит подробно изучить форумы, посвященные конкретной модели устройства.
Как включить поворот экрана на Андроиде
Включение автоматического поворота, как говорилось ранее, проходит в настройках системы. Также есть возможность активировать его при помощи быстрой панели доступа. На Айфонах и на Андроидах, например, различный способ активации поворота. Стоит поговорить об Андроид системах, так как они достаточно популярны.
Для того, чтобы включить автоматический поворот через настройки, необходимо следующее:
- Для начала стоит открыть настройки на телефоне. Они располагаются, как правило, на главном экране устройства. Напоминают иконку в виде шестерёнки. Тапом открываем их;
- После находим специальный раздел под названием «Экран». На разных устройствах автоповорот может располагаться в отличных друг от друга разделах;
- Теперь стоит найти необходимый раздел под названием «Автоповорот» и перевести ползунок в активное состояние.
Теперь, чтобы проверить включенность функции, стоит перевернуть девайс. Если экран поменял свое положение, то пользователю правильно активировал автоматический поворот.
Также присутствует другой способ – через панель быстрого доступа. Она помогает пользователю без перехода в настройки активировать необходимую функцию. Для этого необходимо открыть панель при помощи свайпа вниз, а далее найти иконку, под которой написано «Автоповорот». Кликаем на неё, тем самым и активируем необходимую функцию.
Как видно, автоматический поворот активировать очень просто. Для этого необходимо воспользоваться либо настройками на телефоне, либо же панелью быстрого доступа. Выбор способа зависит от предпочтений пользователя.
Нарушение калибровки
Еще одна причина, почему не работает автоповорот экрана на «Андроиде» и других ОС – нарушение калибровки акселерометра. Данная проблема возникает в результате сбоев в работе системы, а также из-за серьезных падений аппарата.
«Лечится» эта поломка тоже двумя способами. Первый – нужно зайти в настройки телефона и в меню специальных возможностей найти пункт «Датчик ускорения и гироскоп». Важно: на разных телефонах данный пункт может называться по-другому и находиться в других разделах. При нажатии на соответствующий пункт нужно будет положить телефон на ровную поверхность, и калибровка произойдет автоматически.
Второй способ – воспользоваться сторонним приложением для калибровки, благо сейчас их очень много и все они просты в использовании. Из наиболее эффективных стоит отметить Accelerometr Calibration, GPS Status & Toolbox, «Акселерометр».
Дополнительные возможности
Есть и отдельная программа для поворота экрана Андроид — Smart Rotator. Для чего она нужна? Приложение создано для более тонкой настройки этого инструмента. Суть заключается в том, что она сканирует систему и составляет список установленных сервисов. Далее, вы просто отмечаете все приложения, где требуется работа автоматического поворота, а в остальных случаях он будет отключён.
Получается, что это такая себе золотая середина между тем, чтобы функция не включалась, когда не нужно, но активировалась в отдельных приложениях, где без неё не обойтись.
Отметим только одно — не зря она есть в виджете энергосбережения, ведь использование автоповорота требует определённых затрат энергии, поэтому её и поместили в это меню. Если вы стремитесь растянуть время работы устройства Android, вам лучше не пользоваться этой функцией, и уж тем более вам не нужны специальные программы — они только увеличат потребление ресурсов аккумулятора.
Можно сделать вывод, что пользование автоматическим поворотом на Андроид — индивидуальный выбор каждого пользователя, ведь она удобна для многих, но некоторым приносит только дискомфорт. Как бы то ни было, теперь вы знаете больше об этой возможности дисплея, сможете быстро включить или отключить её несколькими способами.
Программные настройки
Если автоповорот экрана перестал функционировать на проверенном гаджете, который ранее нормально работал, то следует проверить настройки, которые могли сбиться. Если самостоятельно разобраться в них сможет не каждый пользовать, то в исправлении проблемы сложностей нет:
- Перезагружаем устройство. Достаточно просто выключить его, несколько минут подождать и снова включить. Не исключено, что автоповорот заработает.
- Если вышеуказанный способ не решил проблему, то проводим более глубокую перезагрузку. Необходимо выключить смартфон, достать аккумулятор, минимум 10 мин подождать и включить его снова. Проверяем, заработает ли автоповорот.
- Проверяем версию операционной системы. Есть вероятность, что текущая система функционирует с ошибками. Важно, чтобы на устройстве Андроид работала актуальная прошивка.
: Android не обновляется по воздуху прошивка
Чтобы проверить версию прошивки, выполняем такие шаги:
- Переходим в «Настройки».
- Выбираем раздел «О телефоне».
- Выбираем пункт «Обновление системы».
- Гаджет автоматически осуществит проверку наличия новой версии программного обеспечения. Если на девайсе установлено неактуальное ПО, то будет предложено произвести его обновление.
Если после вышеописанных действий автоповорот экрана не работает, нужно попробовать возвратиться к заводским настройкам. Пользователю следует перейти в меню, потом выбрать «Настройки», нажать на пункт «Восстановление и сброс». Затем нажимаем «Сброс настроек».
Сброс сотрет всю информацию, а также удалит все инсталлированные программы. После сброса нужно проверить работоспособность функции вышеуказанным способом.
Как откалибровать батарею на Android
За счет чего работает автоповорот экрана
Автоповорот экрана Samsung, Xiaomi, Lenovo, iPad, Microsoft и в других планшетах работает по одному и тому же принципу. В устройстве находится специальный датчик — акселерометр.
Из-за довольно простого рабочего процесса, эта часть определяет, как расположен аппарат по отношению к земле. В случае изменения положения акселерометр также это фиксирует и изменяет ориентацию изображения на дисплее.
Важно понимать, что данный датчик работает только при атмосфере планеты Земля, так как ему нужно определять наличие притяжения. Грубо говоря может быть такое, что автоповорот экрана перестал работать из-за нахождения в вакууме или в месте, где земное притяжение нивелировано или изменено.
Источник