Я пытаюсь найти способ правильно обработать настройку действия, где его ориентация определяется из данных в намерении, которое его запустило. Это для игры, в которой пользователь может выбирать уровни, некоторые из которых имеют книжную ориентацию, а некоторые - альбомную. Проблема, с которой я сталкиваюсь, состоит в том, что setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)
не вступает в силу, пока действие полностью не загружено. Это проблема для меня, потому что во время запуска я выполняю некоторую загрузку и обработку изображений, что я хотел бы сделать только один раз.
В настоящее время, если пользователь выбрал уровень ландшафта:
- действие начинается с onCreate (), по умолчанию - портрет
- обнаруживает, что анализ его запуска Намерение, что он должен быть в альбомной ориентации
- продолжается независимо от пути к onResume (), загрузки информации и выполнения других задач настройки
- в этот момент включается setRequestedOrientation, поэтому приложение запускается от onPause () до onDestroy ()
- затем он снова запускается из onCreate () и запускается в onResume (), повторяя настройку из более раннего
Есть ли способ избежать этого и не выполнить загрузку дважды? Например, в идеале, действие должно знать, прежде чем даже onCreate будет вызван, должен ли он быть альбомным или портретным, в зависимости от какого-то свойства намерения запуска, но если я не пропустил что-то, что невозможно. Мне удалось взломать способ избежать повторения загрузки, проверив boolean
перед длительными шагами загрузки, но это не похоже на правильный способ сделать это. Я думаю, я мог бы переопределить onSaveInstanceState
, но это потребовало бы много дополнительного кодирования. Есть ли простой способ сделать это?
Спасибо!
Решение:
Согласно ответу Даниила, это было довольно легко исправить. Мне просто нужно было сделать несколько небольших изменений. В моей деятельности «меню», где игрок выбирал уровень для игры, мне просто нужно было добавить проверку if / else, чтобы выбрать, какой класс будет запущен моим Намерением. Это было сделано с помощью простого int, представляющего портрет или ландшафт, определяемого, когда игрок выбирает уровень. Затем я создал второй класс, расширяющий мой класс GameLogic; это класс, который содержит большую часть кода для самой игры, а не меню, инструкции и т. д.
public class GameLandscape extends GameLogic{
}
Буквально это просто и совершенно пусто. Таким образом, он унаследовал весь код из моей предыдущей деятельности, где я уже кодировал его, чтобы обрабатывать вещи по-разному в зависимости от ориентации. Наконец, мне просто нужно было добавить в манифест строку, в которой говорилось, что GameLandscape всегда будет работать в альбомной ориентации, а GameLogic всегда будет работать в портретной.
Итак, действительно простая проблема.