- Повороты экрана в Android без боли
- Предисловие
- Когда начались проблемы?
- Возможное решение
- Да начнется магия
- Реализация приложения
- 5 лучших приложений для управления поворотом экрана на 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.
Источник
5 лучших приложений для управления поворотом экрана на Android-устройстве
Функция смены ориентации экрана на Android не всегда работает так, как хочется пользователю — некоторые приложения не переворачиваются, а другие, напротив, переходят из портретного режима в ландшафтный и наоборот в самый неподходящий момент. К счастью, на Android есть приложения, которые позволяют настроить, в каких случая ориентация будет меняться, а в каких нет.
Это приложение добавляет в настройки ориентации несколько новых опций и позволяет перевернуть любое приложение, даже если оно изначально не поддерживает смену режима отображения. Кроме того, оно позволяет обходить стандартные настройки поворота экрана и запрещать приложениям менять интерфейс.
Rotation Manager позволяет выбрать, в какой ориентации экрана будет работать то или иное приложение: ландшафтной, портретной или по выбору системы (в том числе в зависимости от того, как вы держите устройство). Приложение постоянно работает в фоновом режиме, однако, по словам разработчиков, почти не потребляет оперативную память.
Orientation Manager более бережно относится к системным ресурсам — вы можете запретить этому приложению запускаться с загрузкой операционной системы. Когда оно запущено, на экране появляется миниатюрная кнопка, нажатие на которую позволяет форсированно изменить ориентацию любого запущенного приложения. Цвет кнопки можно выбрать в настройках.
С помощью Rotation Control можно запретить выбранным приложениям менять ориентацию интерфейса, активировать авто-поворот, при котором ориентация меняется в зависимости от того, как вы держите устройство, или зафиксировать определенную ориентацию: только портретная или только ландшафтная.
Screen Rotation Controller уведомляет вас, когда какое-либо приложение пытается сменить ориентацию экрана и позволяет разрешить или запретить ему сделать это. Кроме того, с его помощью вы можете форсированно поменять ориентацию любого приложения вручную.
Источник
Как включить или выключить автоповорот экрана
Делимся решением для iOS и Android
Стоит прилечь на бок, чтобы почитать новости на смартфоне, как экран сразу переворачивается. Или хотите посмотреть фото, а экран наоборот остается в вертикальном положении. Согласитесь, бесит? Но с проблемой легко справиться.
Как включить или выключить автоповорот
На iPhone специальная клавиша «Автоповорот» находится под настройками Wi-Fi и Bluetooth в Пункте управления:
- Чтобы войти в него на iPhone с клавишей Touch ID (iPhone SE, 8 и более ранние модели), смахните вверх от нижнего края экрана.
- Чтобы открыть его на iPhone без клавиши, смахните вниз от верхнего правого края экрана.
На смартфонах Samsung c One UI 3.1 тоже есть быстрая клавиша «Автоповорот». Она находится на шторке уведомлений. Чтобы увидеть значок, смахните вниз от верхнего края экрана.
На смартфонах Xiaomi, Poco, Redmi с MIUI 12 клавиша «Автоповорот» находится в нижней половине Пункта управления. Чтобы открыть его, смахните вниз от верхнего правого края экрана.
На смартфонах Huawei и Honor с Magic UI 3.1 клавиша «Автоповорот» находится в шторке уведомлений справа. Чтобы открыть ее, смахните вниз от верхнего края экрана.
А если автоповорот не включается?
Если функция включена, на Android-смартфонах клавиша «Автоповорот» будет синей, а на iPhone — белой на сером фоне. Чтобы убедиться, что всё работает, переверните экран в Safari или Google Chrome — на iPhone, в предустановленном «Браузере» или Google Chrome — на Android. Перевернулся? Хорошо.
Если не перевернулся, причина может быть в следующем.
Приложение не поддерживает альбомный режим. Возможно, вы нас не послушали и запустили тест не в браузере, а в другом приложении. Такое может случиться, так как не все программы поддерживают поворот экрана. Например, на iPhone Telegram переворачивается, а «ВКонтакте» — нет.
Сломался акселерометр. Акселерометр — это датчик, отвечающий за автоповорот экрана при наклоне смартфона. Попробуйте перезагрузить устройство. Если дело в операционной системе смартфона, которая неправильно обрабатывает данные с акселерометра, это поможет.
Перезагрузка не помогла? Смартфону потребуется помощь фирменного сервисного центра. Адреса и контакты:
Источник
Что делать, если не работает автоповорот экрана на Андроид смартфоне
Смотришь в книгу – видишь… альбом. Или наоборот: смотришь в альбом – видишь книгу. Нет, с реальными альбомами и книгами такого не происходит, а с мобильными устройствами – вполне. В норме экран смартфона и планшета автоматически переключается в горизонтальный или вертикальный вид вслед за поворотом девайса. Но бывает, что он застывает в одном положении и не меняет его, как ни крути.
Поговорим, почему не работает автоповорот экрана на Андроид и как устранить неполадку.
Было или стало? Причины, связанные с железом
За автоматический поворот изображения на экране мобильного гаджета отвечает акселерометр – гиродатчик, который измеряет угол наклона аппарата относительно направления силы гравитации Земли. Это недорогое, широко распространённое устройство установлено в абсолютное большинство смартфонов и планшетов. Однако в большинство – не значит во все.
До сих пор можно встретить аппараты, в которых нет акселерометра. Это, как правило, ультрабюджетные девайсы малоизвестных брендов из Поднебесной, и если «напасть одолела» один из их представителей прямо с момента покупки, в первую очередь следует выяснить, а «был ли мальчик».
Для проверки наличия акселерометра в телефоне подойдет любое приложение для диагностики железа Android-устройств, например, Sensor Kinetics. Оно отображает информацию о работе датчиков.
Если в разделе «Акселерометр» написано «Отсутствует на данном устройстве», значит, это тот самый случай. Заставить экран такого девайса поворачиваться вслед за изменением положения, увы, не получится, но это можно компенсировать с помощью сторонних программ. Речь о них пойдет дальше.
Другая группа устройств, которые могут не иметь акселерометра (или иметь неисправный), это побывавшие в ремонте либо нуждающиеся в оном после падения или намокания. Проверить наличие/отсутствие гиродатчика на них можно теми же средствами, что и на предыдущих.
Все остальные случаи мы отнесем к категории «не было, но стало», то есть изначально на устройстве автоповорот работал, но перестал по неизвестным причинам.
Причины, связанные с софтом
В случаях, когда ранее работавший автоповорот экрана отказал без видимых причин, тоже может быть виновато железо. Например, из-за заводского брака или старения устройства (чувствительность гиродатчика со временем уменьшается). Однако 90-95% таких ситуаций связано с программным обеспечением.
- с отключением функции автоповорота в настройках аппарата;
- с системной ошибкой;
- с конфликтом или некорректной работой приложений;
- с действием вредоносных программ.
Самая частая причина
Самая распространенная и легкоустранимая причина сбоя – случайное отключение автоповорота в настройках.
Большинство мобильных девайсов на базе «голого» Андроида или фирменных оболочек имеют кнопку управления автоповоротом в панели уведомлений и быстрого доступа (шторке). Правда, название этой кнопки не всегда точно передает ее назначение. Так, на MIUI 11 и 10 она называется «Ориентация», что сбивает с толку владельцев Xiaomi Redmi 4, 5 и новее:
На ранних версиях MIUI эта кнопка называлась просто «Поворот» или «Автоповорот», как, впрочем, она называется сейчас на многих других устройствах, например, на Samsung, Honor, Meizu, Asus Zen и т. д.
При отключении функции автоповорота название кнопки зачастую меняется на «Вертикальная (горизонтальная) ориентация» или «Книжный (альбомный) экран», что тоже иногда путает пользователей:
Чтобы восстановить автоматический поворот, отключенный этой кнопкой, достаточно коснуться ее еще раз.
Помимо панели быстрого доступа, средства управления автоповоротом дисплея есть в системных настройках. Одна из опций находится в разделе «Экран». Она позволяет выбрать действие при повороте устройства – поворачивать изображение или сохранять ориентацию по умолчанию.
Другая спрятана в «Специальных возможностях». Она, как и кнопка «за шторкой», просто активирует или деактивирует автоповорот.
Некоторые модели устройств позволяют включать и отключать автоматический поворот отдельно на главном экране и на экране голосовых вызовов. Управление этой функцией производится через панель быстрого доступа.
Ошибки системы, вирусы, некорректная работа приложений
Системные ошибки бывают временными и постоянными. Первые – это те, которые связаны с текущим выполнением процессов и служб операционной системы и «живут» не дольше одного сеанса. Вторые связаны с изменениями в системных файлах и настройках.
Ошибки первой группы легко устраняются перезапуском устройства, а второй – только устранением причины, которая вызвала сбой.
Временные ошибки возникают спонтанно на любых устройствах зачастую без видимых причин. Постоянные – чаще следствие каких-либо явных событий, например, операций с системными файлами на смартфонах и планшетах с root, установки обновлений и т. д.
Заражение устройства вредоносным ПО тоже нередко сопровождается нарушением системных функций, особенно тех, которые упрощают обнаружение или удаление зловреда, например, операций с приложениями, изменений настроек, запуска аппарата в безопасном режиме и прочего подобного. Функция автоповорота экрана вряд ли является целью создателей вирусов, но она может быть нарушена вместе с чем-то из перечисленного выше.
Заподозрить заражение Андроид-гаджета вредоносным ПО можно по типичным признакам, если они сопутствуют проблеме с поворотом экрана. Например:
- Выскакивающей рекламе, не связанной с какой-либо программой.
- Тревожными сообщениями антивируса.
- Самопроизвольным удалением защитных приложений.
- Появлением новых приложений, которые вы не устанавливали.
- Кражей аккаунтов в мессенджерах и соцсетях, пропаданием денег из электронных кошельков, которыми вы пользуетесь на устройстве и т. п.
Другие симптомы присутствия вирусов на мобильном девайсе и методы борьбы с ними описаны в этой статье.
При конфликте или сбое в работе приложений чаще всего прослеживается связь появления неполадки с установкой или запуском какой-либо программы, в том числе не использующей гиродатчик. Например, на корректную работу кнопки автоповорота в панели быстрого доступа может влиять сторонний лаунчер или приложение, изменяющее дизайн шторки.
Как восстановить функцию автоповорота экрана при сбоях системы и программ
Если предыдущее действие не помогло, переходите к следующему.
- Перезагрузите аппарат. Это устранит временные ошибки системы.
- Удалите приложения, которые вы установили незадолго до возникновения проблемы.
- Просканируйте устройство на вирусы.
- Сбросьте настройки Android к заводскому состоянию.
Если поворот экрана перестал работать после манипуляций с системными файлами на аппаратах с root, откат к заводским настройкам не поможет. При отсутствии возможности исправить то, что было изменено, вручную, спасет только перепрошивка.
Приложения для управления поворотами дисплея и калибровки акселерометра
Если вам так и не удалось восстановить встроенную функцию автоповорота либо если на вашем устройстве отсутствует или не работает акселерометр, компенсировать этот недостаток поможет стороннее приложение. С его помощью вы сможете управлять поворотом экрана в автоматическом и ручном режиме, а также блокировать экран в нужном положении.
Разумеется, автоматический поворот доступен только на девайсах с исправным гиродатчиком, в иных случаях вам придется управлять им с помощью кнопок, которые приложение добавляет в строку состояния.
По функциональности все программы этого класса примерно одинаковы, но, возможно, не все они будут хорошо работать на вашем устройстве. Поэтому пробуйте разные, пока не найдете свое.
Вот неполный список бесплатных приложений для управления поворотом экрана на Андроиде:
Встречаются устройства, на которых функция автоповорота экрана вроде работает, а вроде и нет. Точнее, она срабатывает через раз или не тогда, когда нужно. Подобное происходит при нарушении калибровки гиродатчика, которое на многих смартфонах и планшетах возникает с возрастом, а также в результате падений или частого воздействия вибрации.
Восстановить калибровку довольно просто – для этого есть бесплатное приложение Accelerometer Calibration Free. Оно сбрасывает старые параметры акселерометра и устанавливает новые. После этого точность определения положения аппарата заметно повышается.
Accelerometer Calibration Free всё делает автоматически. Вам лишь нужно сориентировать гаджет в пространстве так, чтобы красная точка оказалась в центре экрана.
Затем нажать кнопку «Calibrate» и после окончания операции перезагрузить систему. Теперь, если гиродатчик исправен, функция автоповорота заработает как надо.
Кстати, если держать Accelerometer Calibration Free запущенным постоянно, он будет следить за работой акселерометра и уведомит вас, если потребность в калибровке возникнет снова. Это удобно, просто, а главное — эффективно. Теперь функция автоповорота под надежным контролем.
Источник