Android studio как запретить поворот экрана
Перейти к содержимому

Android studio как запретить поворот экрана

Отключить поворот экрана во время выполнения на Android

Мое приложение, как указано выше, и добавьте android: configChanges = «Ориентация» в xml. когда мое приложение запускает мой экран ПОРТРЕТ, я нажимаю ctrl + F12, экран также вращается, экран — ПЕЙЗАЖ, во-вторых, я нажимаю ctrl + F12, экран также вращается, экран — ПОРТРЕТ, затем я нажимаю ctrl + F12, на экране остается ПОРТРЕТ. поэтому я нажимаю еще раз, на экране остается ПОРТРЕТ. У меня вопрос, почему мой экран не сохраняет ПОРТРЕТ при запуске приложения.

Изменить: я хочу использовать код для управления поворотом экрана, могу ли я это сделать?

5 ответов

Если вы пытаетесь заставить свое приложение все время находиться в портретном режиме, вы можете добавить эту строку к элементу в манифесте.

Добавьте эту строку в каждое действие в файле AndroidManifest.xml.

Вы также можете отключить поворот экрана во время выполнения из исходного кода Java.
Просто попробуйте так

Теперь попробуйте вызвать этот метод во время выполнения вашего приложения. Может быть в некоторых методах или на некоторых кнопках.

http://androidbiancheng.blogspot.com/2010/10/java-setrequestedorientation.html, эта ссылка решила мой вопрос, setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); и не нужно добавлять строку android: configChanges = «ориентация» в xml. поэтому я думаю, что не могу использовать конфигурацию для получения ориентации экрана, следует использовать ActivityInfo .

Измените файл AndroidManifest.xml. Достаточно.

<activity android:name=»Activity_Name» android:screenOrientation=»portrait»/>

Теперь ваше приложение не изменит ориентацию.

Я считаю, что вы ищете метод Activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_<PORTRAIT/LANDSCAPE>)

Для этого действия в манифесте, чтобы сообщить системе, что вы будете управлять ориентацией самостоятельно, следует отключить автоматическое изменение ориентации.

Как запретить смену ориентации экрана программно?

Проведя пальцем по экрану сверху вниз, мы попадаем вверху в меню с кнопками. Например: звук (изменить звук), поворот экрана (разрешаем или запрещаем поворот экрана) и т.д.

А можно ли программно нажать на кнопку «Поворот экрана», а именно: запретить поворот экрана?

Иными словами: как программно запретить поворот, а по завершении программы вернуть в положение перед запуском. Т.е. если перед запуском был ландшафт, то он и останется им до конца работы приложения, а если был портрет, то он тоже останется до конца работы приложения?

Вариант с android:screenOrientation=»portrait» в Манифесте не предлагать. Он не решает данную проблему!

Ответы (3 шт):

Ответы с en-SO раз и два

Получаем два варианта: ландшафт и портрет

Получаем 4 варианта с углами поворота относительно дефолтного значения

Теперь устанавливайте полученную ориентацию:

Все с того же en-SO:

Вызов: блокировка: new LockOrientation(this).lock(); разблокировка: new LockOrientation(this).unlock();

Повороты экрана в Android без боли

image

Важно!
Изначально в статье была реализация с ошибкой. Ошибку исправил, статью немного поправил.

Предисловие

Истинное понимание проблем каждой платформы приходит после того, как попробуешь писать под другую платформу / на другом языке. И вот как раз после того, как я познакомился с разработкой под 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.

Добавить комментарий

Ваш адрес email не будет опубликован.