Запретить пересоздание Activity при повороте экрана
Перепробовал разные варианты когфига, на эмуляторе работает, а вот на реальном устройстве пересоздается, на телефоне 4.3 стоит.
Есть может быть какие-нибудь идее, как это исправить?
Жизненный цикл Activity и Fragment при повороте
Ребят запутался я совсем. Помогите разобраться. Насколько я знаю при повороте удаляется активити.
Ошибка при повороте экрана
Доброго времени суток, пишу по следующему вопросу: Начал изучать программирование под андроид и.
При повороте экрана выпадает ошибка
Доброе утро товарищи. Пытаюсь протестить аппку на реальном устройстве. Подключил через шнурок.
это по работе, поэтому, к сожалению, не имею права выкладывать.
А в чем собственно может быть проблема в самом проекте?
Есть мысль, что проект этот писался на эклипсе и мне перешел в зип архиве, поэтому импорт вышел такой себе, без gradle scripts, может быть в этом проблема?
Добавлено через 32 секунды
нужно обязательно, чтобы и в landscape работало
нет манифеста — нет решения, все просто
это не форум гадалок
«пересоздается» — понятие очень расплывчатое
Сохранение объекта при повороте экрана
здравствуйте,читаю в доках,что метод onRetainNonConfigurationInstance () устарел и надо.
Сохранить imageview при повороте экрана
Доброго времени суток. При повороте екрана нужно сохранить imageView. Знаю что нужно использовать .
Ошибка при загрузки изображений с карты памяти при повороте экрана
Здравствуйте! Вопрос в следующем. Загружаю в активити фотки с камеры. Имя файла передаю следующим.
Ошибка при повороте экрана в горизонтальное положение
Здравствуйте, получаю такую ошибку при выходе из приложения в горизонтальном положении в.
Источник
Перезапуск активности при вращении Android
в моем приложении для Android, когда я поворачиваю устройство (выдвигаю клавиатуру), то мой Activity перезапускается ( onCreate называется). Теперь, вероятно, так и должно быть, но я делаю много начальной настройки в onCreate метод, поэтому мне нужно либо:
- поместите всю начальную настройку в другую функцию, чтобы она не потерялась при вращении устройства или
- сделать так onCreate не вызывается снова и макет просто корректирует или
- ограничение приложение просто портрет, так что onCreate не называется.
30 ответов
использование класса Application
в зависимости от того, что вы делаете в своей инициализации, вы можете рассмотреть возможность создания нового класса, который расширяет Application и перемещение кода инициализации в переопределенный onCreate метод в этом классе.
на onCreate в классе приложения вызывается только при создании всего приложения, поэтому перезапуск активности при изменении ориентации или видимости клавиатуры не вызовет он.
рекомендуется предоставить экземпляр этого класса как одноэлементный и предоставить переменные приложения, которые вы инициализируете с помощью геттеров и сеттеров.
Примечание: вам нужно будет указать имя вашего нового класса приложения в манифесте для его регистрации и использования:
реагирование на изменения конфигурации [UPDATE: это устарело с API 13;см. Рекомендуемый альтернатива]
в качестве дополнительной альтернативы вы можете заставить приложение прослушивать события, которые могут вызвать перезапуск – например, изменения ориентации и видимости клавиатуры – и обрабатывать их в своей деятельности.
начните с добавления android:configChanges узел манифеста узла вашей деятельности
затем в пределах действия переопределить onConfigurationChanged метод и вызов setContentView чтобы заставить макет GUI быть повторно сделано в новой ориентации.
обновление для Android 3.2 и выше:
осторожностью: начиная с Android 3.2 (уровень API 13), «размер экрана» также изменения когда устройство переключается между портретной и альбомной ориентации. Таким образом, если вы хотите предотвратить перезапуск среды выполнения из-за изменения ориентации при разработке для уровня API 13 или выше (как объявлено атрибутами minSdkVersion и targetSdkVersion), вы должны включить «screenSize» значение в дополнение к «orientation» значение. То есть вы должны объявить android:configChanges=»orientation|screenSize» . Однако, если ваше приложение нацелено на уровень API 12 или ниже, то ваша активность всегда обрабатывает это изменение конфигурации сама (это изменение конфигурации не перезапускает вашу активность, даже при запуске на устройстве Android 3.2 или выше).
вместо того, чтобы пытаться остановить onCreate() от увольнения в целом, возможно, попробуйте проверить Bundle savedInstanceState передается в событие, чтобы увидеть, если он имеет значение null или нет.
например, если у меня есть логика, которая должна быть запущена, когда Activity действительно создан, а не на каждом изменении ориентации, я только запускаю эту логику в onCreate() только если savedInstanceState равно null.
в противном случае я все еще хочу, чтобы макет перерисовывался правильно для ориентация.
Не уверен, что это окончательный ответ, но это работает для меня.
в манифесте, в раздел activity, добавлено:
в коде для деятельности, осуществляемой:
то, что вы описываете, это поведение по умолчанию. Вы должны обнаружить и обработать эти события самостоятельно, добавив:
в манифесте, а затем изменения, которые вы хотите обработать. Поэтому для ориентации вы будете использовать:
и для открываемой или закрываемой клавиатуры вы будете использовать:
если вы хотите обрабатывать оба, вы можете просто разделить их с помощью команды pipe, например:
это вызовет метод onConfigurationChanged в любом вызываемом действии. При переопределении метода можно передать новые значения.
надеюсь, что это помогает.
Я только что открыл это знание:
для поддержания активности через изменение ориентации и обработки ее через onConfigurationChanged , документация и пример кода выше предложите это в файле манифеста:
, который имеет дополнительное преимущество, что он всегда работает.
бонусное знание заключается в том, что опуская keyboardHidden может показаться логичным, но это вызывает сбои в эмулятор (для Android 2.1, По крайней мере): указание только orientation заставит эмулятор вызвать оба OnCreate и onConfigurationChanged иногда, и только OnCreate другое время.
Я не видел сбоя на устройстве,но я слышал о сбоях эмулятора для других. Так что это стоит документировать.
вы также можете рассмотреть возможность использования способа Android платформы для сохранения данных через изменения ориентации: onRetainNonConfigurationInstance() и getLastNonConfigurationInstance() .
это позволяет сохранять данные через изменения конфигурации, такие как информация, которую вы, возможно, получили от выборки сервера или что-то еще, что было вычислено в onCreate или с тех пор, а также позволяет Android перестроить ваш Activity использование xml-файла для используемой ориентации.
следует отметить, что эти методы теперь устарели (хотя все еще более гибкие, чем изменение ориентации обработки, как предлагает большинство вышеупомянутых решений) с рекомендацией, чтобы все переключились на Fragments и вместо того, чтобы использовать setRetainInstance(true) в каждом Fragment вы хотите сохранить.
подход полезен, но является неполным при использовании фрагментов.
фрагменты обычно воссоздаются при изменении конфигурации. Если вы не хотите, чтобы это произошло, используйте
setRetainInstance(true); в конструкторе фрагмента(ов)
это приведет к сохранению фрагментов во время изменения конфигурации.
Я просто добавил
в файле манифеста и не добавлять любой onConfigurationChanged метод в своей деятельности.
какая часть манифеста говорит ему: «не звоните onCreate() «?
также, Документы Google говорят, чтобы избежать использования android:configChanges (кроме как в крайнем случае). Но тогда альтернативные методы они предлагают все DO использовать android:configChanges .
по моему опыту, эмулятор всегда вызывает onCreate() при вращении.
Но 1-2 устройства, на которых я запускаю тот же код. Не. (Не знаю, почему это так важно.)
добавить эту строку в манифест :-
и этот фрагмент действия: —
изменения, которые будут внесены в манифест Android:
дополнения, которые будут сделаны внутри деятельности являются:
на onCreate метод по-прежнему вызывается даже при изменении orientation android. Поэтому перемещение всей тяжелой функциональности в этот метод не поможет вам
поместите код ниже внутри вашего tag in Manifest.xml :
есть несколько способов сделать это:
Сохранить Состояние Активности
вы можете сохранить состояние активности в onSaveInstanceState .
а затем используйте bundle для восстановления состояния.
обрабатывать изменения ориентации себя
Другой альтернативой является обработка изменений ориентации самостоятельно. Но это не считается хорошей практикой.
добавьте это в манифест файл.
для Android 3.2 и более поздних версий:
ограничить вращение
вы также можете ограничить свою деятельность портретным или ландшафтным режимом, чтобы избежать вращения.
добавьте это в тег действия в файле манифеста:
или реализуйте это программно в своей деятельности:
Это очень просто, просто выполните следующие действия:
это работает для меня :
Примечание: ориентация зависит от вашего requitement
способ, которым я нашел это сделать, — использовать onRestoreInstanceState и onSaveInstanceState событий, чтобы сохранить что-то в Bundle (даже если вам не нужны сохраненные переменные, просто поместите что-то туда, чтобы Bundle не пуста). Затем, на onCreate метод, проверьте, чтобы увидеть, если Bundle пусто, и если это так, то сделайте инициализацию, если нет, то сделайте это.
несмотря на то, что это не «путь Android», я получил очень хорошие результаты, обрабатывая изменения ориентации сам и просто перемещая виджеты в представлении, чтобы учесть измененную ориентацию. Это быстрее, чем любой другой подход, потому что ваши взгляды не должны быть сохранены и восстановлены. Это также обеспечивает более плавный опыт для пользователя, потому что respositioned виджеты точно такие же виджеты, просто перемещены и / или изменены. Не только модель, но и состояние просмотра, может быть сохранено таким образом.
RelativeLayout иногда может быть хорошим выбором для представления, которое должно время от времени переориентироваться. Вы просто предоставляете набор параметров портретной компоновки и набор параметров ландшафтной компоновки с различными правилами относительного позиционирования для каждого дочернего виджета. Затем, в onConfigurationChanged() метод, вы передаете соответствующий метод в setLayoutParams() звонок на каждого ребенка. Если какой-либо дочерний контроль должен быть внутри переориентируется, вы просто вызываете метод на этом ребенке, чтобы выполнить переориентацию. Этот ребенок аналогичным образом вызывает методы на любом из его дочерние элементы управления, которые нуждаются в внутренней переориентации, и так далее.
Примечание: я отправляю этот ответ, если кто в будущем столкнется с той же проблемой как меня. Мне не хватило следующей строчки:—6—>
когда я повернул экран, метод onConfigurationChanged (Configuration newConfig) не был вызван.
устранение: мне также пришлось добавить «screenSize», даже если проблема была связана с ориентацией. Так в AndroidManifest.xml-файл, добавьте это:
затем реализовать метод onConfigurationChanged(Configuration newConfig)
вам нужно использовать метод onSavedInstanceState для хранения всего значения его параметра имеет, что является bundle
заправшивать и выберите значение для просмотра объектов он будет обрабатывать повороты экрана
каждый раз, когда экран поворачивается, открытое действие завершено и onCreate() вызывается снова.
1 . Вы можете сделать одну вещь, чтобы сохранить состояние активности при повороте экрана, чтобы вы могли восстановить все старые вещи при повторном вызове activity onCreate (). См.этой ссылке
2 . Если вы хотите предотвратить перезапуск действия, просто поместите следующие строки в манифест.XML-файл.
Источник
Запрет пересоздания Activity
При развороте экрана или блокировки-разблокировке происходит пересоздание Активити.
разворот экрана я запретил а как быть с блокировкой?
Научиться нормально обрабатывать?
vitas212
> разворот экрана я запретил
ты запретил сам разворот? просто можно запретить пересоздание при развороте, а сам разворот оставить.
Нет такоо флага. Пользователь может просто выключить девайс и он заблокируется.
Я не про флаг, запрещающий блокировку, а про флаг, запрещающий пересоздание при блокировке. Например, по умолчанию поворот экрана — это пересоздание активити, а можно сделать так, что при вращении экрана активити не пересоздаётся.
Под андроидом любое приложение может быть убито системой в любой момент времени — например, если системе не хватает ресурсов для выполнения какого-то другого приложения. Это просто надо иметь ввиду и понимать, что от тебя оно никак не зависит.
Вообще, если приложение жрёт не очень много ресурсов — оно с очень большой долей вероятности не будет выгружено при блокировке. Если же активити постоянно пересоздаётся после блокировки — скоррее всего, оно некорретно себя ведёт при блокировке, либо жрёт слишком много памяти.
Вроде как-то так.
slava_mib
ЕМНИП, при блокировке уничтожается GL контекст, а уничтожение активити это уже следствие.
trex
> ЕМНИП, при блокировке уничтожается GL контекст
Тем не менее, все игры даже на андроиде 2.3 при блокировке/разблокировке не перезагружаются и мгновенно продолжают и графику рисовать, и музыку крутить. То есть перезагрузки ресурсов никакой не происходит вообще. Как этого добиться?
ALPINE
Если все данные уже в памяти и их надо просто залить в видеопамять (которая на самом деле на том же чипе находится), на это много времени не уйдет. Как вариант, можно в фоне держать еще один готовый к работе контекст, но это какой-то мутный путь.
Меня тоже интересует этот вопрос. Делаю живые обои
public class MyWallpaperService extends GLWallpaperService
В манифесте прописал android:configChange
Добавил
> ЕМНИП, при блокировке уничтожается GL контекст, а уничтожение активити это уже следствие.
trex, он не уничтожается, а ставится на паузу. Если в паузе не пытаться что-то с ним химичить — проблем не будет и после разблокировки в активити придёт сообщение что можно работать дальше.
slava_mib
Я при onPause выставляю флаг, запрещающий перерисовку в onDrawFrame. Но при этом, всё равно сбрасывается контекст и вызывается onSurfaceCreated(GL10 unused, EGLConfig config) (экран ненадолго чернеет). Подскажи в какую сторону смотреть, чтобы обойти.
> Но при этом, всё равно сбрасывается контекст и вызывается onSurfaceCreated
То, что контекст сбрасывается — ничему не мешает. Надо просто перезагрузить потерянные текстуры и буферы и спокойно продолжать работу.
slava_mib
> он не уничтожается, а ставится на паузу
Как контекст можно поставить на паузу?
Источник