В моем приложении для Android, когда я поворачиваю устройство (выдвигаю клавиатуру), то мой Activity
перезагружается ( onCreate
называется). Теперь, вероятно, так и должно быть, но я делаю много начальных настроек в onCreate
методе, поэтому мне нужно либо:
- Поместите все начальные настройки в другую функцию, чтобы они не терялись при повороте устройства или
- Сделайте так, чтобы
onCreate
он не вызывался снова, а макет просто настраивается или - Ограничьте приложение только портретом, чтобы
onCreate
он не вызывался.
android
rotation
android-activity
Исаак Уоллер
источник
источник
Ответы:
Использование класса приложения
В зависимости от того, что вы делаете при инициализации, вы можете рассмотреть возможность создания нового класса, который расширяет
Application
и перемещает ваш код инициализации в переопределенныйonCreate
метод внутри этого класса.Класс
onCreate
в приложении вызывается только при создании всего приложения, поэтому действие перезапускается при изменении ориентации, иначе изменения видимости клавиатуры не вызовут его.Хорошей практикой является представление экземпляра этого класса как одиночного и предоставление переменных приложения, которые вы инициализируете, с помощью методов получения и установки.
ПРИМЕЧАНИЕ. Вам нужно будет указать имя вашего нового класса приложения в манифесте, чтобы он был зарегистрирован и использован:
Реакция на изменения конфигурации [ОБНОВЛЕНИЕ: это устарело с API 13; см. рекомендуемый вариант ]
В качестве дополнительной альтернативы вы можете заставить ваше приложение прослушивать события, которые могут вызвать перезапуск - например, изменения ориентации и видимости клавиатуры, - и обрабатывать их в вашей деятельности.
Начните с добавления
android:configChanges
узла в узел манифеста вашей деятельностиили для Android 3.2 (уровень API 13) и новее :
Затем в Activity переопределите
onConfigurationChanged
метод и вызовите,setContentView
чтобы принудительно сделать макет графического интерфейса в новой ориентации.источник
android:configChanges
) следует избегать и использовать только в качестве крайней меры. Пожалуйста, прочитайте Обработка изменений времени выполнения для получения дополнительной информации о том, как правильно обрабатывать перезапуск из-за изменения конфигурации. Вместо этого, чтобы сохранить данные в событиях вращения, они предпочитают использоватьonSaveInstanceState Bundle
; или как @ Jon-O упоминает ,onRetainNonConfigurationInstance
.onRetainNonConfigurationChanges
более отказоустойчивым и прямым.Обновление для Android 3.2 и выше:
источник
Fragments
иsetRetainInstance
вместо.screenSize
для Android 3.2 и выше, который решил мою проблему, спасибо!Вместо того, чтобы пытаться
onCreate()
полностью запретить запуск, возможно, попробуйте проверить, было лиBundle
savedInstanceState
оно передано в событие, чтобы увидеть, является ли оно нулевым или нет.Например, если у меня есть какая-то логика, которая должна запускаться, когда
Activity
она действительно создана, а не при каждом изменении ориентации, я запускаю эту логикуonCreate()
только в том случае, еслиsavedInstanceState
она нулевая.В противном случае я все еще хочу, чтобы макет правильно перерисовывался для ориентации.
не уверен, что это окончательный ответ, но он работает для меня.
источник
Intent serverintent = new Intent(MainActivity.this, MessageListener.class);
иstartService(serverintent);
создатьserverSocket = new ServerSocket(0xcff2);
иSocket client = serverSocket.accept();
сBufferedReader(new InputStreamReader(client.getInputStream()));
и мог вращать мой андроид и поддерживать соединение клиент / сервер активным, но иметь графический интерфейс поворота. Согласно руководству, saveInstanceState инициализируется после завершения последней операции.что я сделал...
в манифесте к разделу активности добавлено:
В коде для деятельности реализовано:
источник
То, что вы описываете, является поведением по умолчанию. Вы должны обнаружить и обработать эти события самостоятельно, добавив:
в ваш манифест, а затем изменения, которые вы хотите обработать. Так что для ориентации вы бы использовали:
и для открытия или закрытия клавиатуры вы должны использовать:
Если вы хотите обработать оба, вы можете просто разделить их командой pipe, например:
Это вызовет метод onConfigurationChanged в любой операции, которую вы вызываете. Если вы переопределите метод, вы можете передать новые значения.
Надеюсь это поможет.
источник
Я только что обнаружил это знание:
Чтобы сохранить активность в процессе изменения ориентации и справиться с этим
onConfigurationChanged
, приведенная выше документация и пример кода предлагают это в файле манифеста:который имеет дополнительное преимущество, что он всегда работает.
Суть в том, что опускание
keyboardHidden
может показаться логичным, но это приводит к сбоям в эмуляторе (по крайней мере, для Android 2.1): указание толькоorientation
приведет к вызову эмулятора какOnCreate
иonConfigurationChanged
иногда, так и только вOnCreate
других случаях.Я не видел сбой на устройстве, но я слышал о сбое эмулятора для других. Так что стоит документировать.
источник
Fragments
иsetRetainInstance
вместо.Вы можете также рассмотреть возможность использования платформы Android для сохранения данных при изменении ориентации:
onRetainNonConfigurationInstance()
иgetLastNonConfigurationInstance()
.Это позволяет вам сохранять данные при изменениях конфигурации, такие как информация, которую вы, возможно, получили из выборки сервера или чего-то еще, что было вычислено в том
onCreate
или ином периоде , а также позволяет Android изменять макет вашегоActivity
используя файл xml для ориентации, используемой в настоящее время. ,Смотрите здесь или здесь .
Следует отметить, что эти методы в настоящее время устарели (хотя они по-прежнему более гибкие, чем управление изменением ориентации самостоятельно, как предлагает большинство из приведенных выше решений) с рекомендацией, чтобы все переключались
Fragments
и вместо этого использовалиsetRetainInstance(true)
каждый из них, которыйFragment
вы хотите сохранить.источник
Подход полезен, но неполон при использовании фрагментов.
Фрагменты обычно воссоздаются при изменении конфигурации. Если вы не хотите, чтобы это произошло, используйте
setRetainInstance(true);
в конструкторе (ах) фрагментаЭто приведет к тому, что фрагменты будут сохранены во время изменения конфигурации.
http://developer.android.com/reference/android/app/Fragment.html#setRetainInstance(boolean)
источник
setRetainInstance()
метод @Abdo, упомянутый выше.Я просто добавил
в файле манифеста и не добавил ни одного
onConfigurationChanged
метода в моей деятельности.Поэтому каждый раз, когда клавиатура выдвигается или ничего не происходит .
источник
<application ...android:configChanges="keyboard|keyboardHidden|orientation">
и работает. Мои настройки в build.gradle:minSdkVersion 15, compileSdkVersion 23, buildToolsVersion "23.0.2"
onCreate
Метод еще называют , даже если вы изменитеorientation
на андроид. Таким образом, перенос всей тяжелой функциональности на этот метод не поможет вамисточник
Поместите код ниже внутри вашего
<activity>
тега вManifest.xml
:источник
Какая часть манифеста говорит «не звони
onCreate()
»?Кроме того, документы Google говорят, что следует избегать использования
android:configChanges
(кроме как в крайнем случае) .... Но тогда альтернативные методы, которые они предлагают, все ДОЛЖНЫ использоватьandroid:configChanges
.По моему опыту, эмулятор ВСЕГДА вызывает
onCreate()
по очереди.Но на 1-2 устройствах, на которых я запускаю один и тот же код ... нет. (Не уверен, почему будет какая-либо разница.)
источник
Это очень просто, просто выполните следующие шаги:
Это работает для меня:
Примечание: ориентация зависит от вашего требования
источник
В манифесте Android необходимо внести следующие изменения:
Дополнения, которые будут сделаны внутри деятельности:
источник
Добавьте эту строку в свой манифест: -
и этот фрагмент к деятельности: -
источник
Есть несколько способов сделать это:
Сохранить состояние активности
Вы можете сохранить состояние активности в
onSaveInstanceState
.а затем используйте
bundle
для восстановления состояния.Обращайтесь с изменениями ориентации самостоятельно
Другая альтернатива - справиться с изменениями ориентации самостоятельно. Но это не считается хорошей практикой.
Добавьте это в свой файл манифеста.
для Android 3.2 и более поздних версий:
Ограничить вращение
Вы также можете ограничить свою деятельность портретным или ландшафтным режимом, чтобы избежать вращения.
Добавьте это к тегу активности в вашем файле манифеста:
Или внедрите это программно в свою деятельность:
источник
Способ я нашел , чтобы это сделать , это использовать
onRestoreInstanceState
иonSaveInstanceState
события , чтобы сохранить что - то вBundle
(даже если вы не нужны какие - либо переменные сохраняются, просто положить что - то в там , так чтоBundle
не пуста). Затем вonCreate
методе проверьте,Bundle
является ли объект пустым, и если он есть, то выполните инициализацию, если нет, то сделайте это.источник
Несмотря на то, что это не «способ Android», я получил очень хорошие результаты, самостоятельно обрабатывая изменения ориентации и просто перемещая виджеты в пределах вида, чтобы принять во внимание измененную ориентацию. Это быстрее, чем любой другой подход, потому что ваши представления не должны быть сохранены и восстановлены. Это также обеспечивает более плавное взаимодействие с пользователем, поскольку видоизмененные виджеты - это точно такие же виджеты, только что перемещенные и / или измененные. Таким образом можно сохранить не только состояние модели, но и состояние просмотра.
RelativeLayout
иногда может быть хорошим выбором для представления, которое время от времени должно переориентироваться. Вы просто предоставляете набор параметров портретного макета и набор параметров ландшафтного макета с различными правилами относительного позиционирования для каждого дочернего виджета. Затем в своемonConfigurationChanged()
методе вы передаете соответствующийsetLayoutParams()
вызов каждому ребенку. Если какой-либо дочерний элемент управления должен быть внутренне переориентирован, вы просто вызываете метод для этого дочернего элемента, чтобы выполнить переориентацию. Этот дочерний процесс аналогичным образом вызывает методы любого из своих дочерних элементов управления, которые нуждаются во внутренней переориентации и т. Д.источник
Каждый раз, когда экран поворачивается, открытое действие заканчивается и снова вызывается onCreate ().
1 Вы можете сделать одно, сохранить состояние активности при повороте экрана, чтобы вы могли восстановить все старые вещи, когда функция onCreate () вызывается снова. Отослать это ссылки
2 Если вы хотите предотвратить перезапуск действия, просто поместите следующие строки в файл manifest.xml.
источник
вам нужно использовать метод onSavedInstanceState, чтобы сохранить все значения для его параметра, который имеет связку
и использовать
чтобы получить и установить значение для просмотра объектов, он будет обрабатывать поворот экрана
источник
Примечание: я публикую этот ответ, если в будущем кто-то столкнется с той же проблемой, что и я. Для меня не было достаточно следующей строки:
Когда я повернул экран, метод `onConfigurationChanged (Configuration newConfig) не был вызван.
Решение: мне также пришлось добавить «screenSize», даже если проблема была связана с ориентацией. Поэтому в файле AndroidManifest.xml добавьте следующее:
Затем реализовать метод
onConfigurationChanged(Configuration newConfig)
источник
В разделе действий
manifest
добавьте:источник
Добавьте эту строку в манифест:
android:configChanges="orientation|screenSize"
источник
Люди говорят, что вы должны использовать
Но лучший и самый профессиональный способ справиться с вращением в Android - это использовать класс Loader. Это не известный класс (я не знаю почему), но он намного лучше, чем AsyncTask. Для получения дополнительной информации вы можете прочитать учебники по Android, которые можно найти в курсах по Android от Udacity.
Конечно, в качестве другого способа вы можете сохранить значения или представления с помощью onSaveInstanceState и прочитать их с помощью onRestoreInstanceState. Это зависит от вас на самом деле.
источник
Через некоторое время проб и ошибок я нашел решение, которое соответствует моим потребностям в большинстве ситуаций. Вот код:
Конфигурация манифеста:
Основная деятельность:
И образец фрагмента:
Можно найти на GitHub .
источник
Используйте
orientation
слушателя для выполнения разных задач с различной ориентацией.источник
Поместите этот код ниже в ваш
Activity
входAndroid Manifest
.Это не возобновит вашу деятельность, когда вы измените ориентацию.
источник
Исправьте ориентацию экрана (альбомную или книжную) в
AndroidManifest.xml
android:screenOrientation="portrait"
илиandroid:screenOrientation="landscape"
для этого ваш
onResume()
метод не вызывается.источник
Один из лучших компонентов архитектуры Android, представленный Google, удовлетворит все ваши требования, а именно ViewModel.
Это предназначено для хранения и управления данными, относящимися к пользовательскому интерфейсу, в режиме жизненного цикла, а также позволит выживать данным при повороте экрана
Пожалуйста, обратитесь это: https://developer.android.com/topic/libraries/architecture/viewmodel
источник
Вы можете использовать объект ViewModel в своей деятельности.
Объекты ViewModel автоматически сохраняются во время изменений конфигурации, поэтому данные, которые они хранят, сразу же становятся доступны для следующего действия или экземпляра фрагмента. Читать далее:
https://developer.android.com/topic/libraries/architecture/viewmodel
источник