Как изменить ориентацию экрана, не создавая новую активность на Android?
Я не знаю, правильное ли название, вот что происходит.
У меня есть приложение, которое работает по-разному на телефоне и на планшете, на телефоне он отображается как портрет на планшете, который он показывает как пейзаж.
Для этого я создал класс CoreActivity, который расширяется всеми моими действиями и делает следующее:
public class CoreActivity extends Activity {
protected boolean _landscape = false;
public boolean isPhone() {
int layoutSize = getScreenLayoutSize();
return (layoutSize == Configuration.SCREENLAYOUT_SIZE_SMALL || layoutSize == Configuration.SCREENLAYOUT_SIZE_NORMAL);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (isPhone() && !_landscape) {
this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
} else {
this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
}
protected int getScreenLayoutSize() {
return (getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK);
}
}
Моя проблема возникает, когда я хочу показать экран настройки телефона в альбомном режиме, для этого я использую следующее:
@Override
protected void onCreate(Bundle savedInstanceState) {
_landscape = true
super.onCreate(savedInstanceState);
}
Проблема в том, что на телефоне, если пользователь держит телефон в портретном режиме (как это было бы, так как большая часть приложения находится в портретном режиме), тогда действие создается и уничтожается, а затем воссоздается. Но если они удерживают его в ландшафтном режиме, то он создается только один раз.
Моя проблема возникает, потому что в методе onCreate я запускаю потоки, которые загружают данные, а также показываю фрагменты.
Есть ли способ избежать этой проблемы? есть ли способ запустить действие с самого начала в портретном режиме, а не изменять его или создать его дважды?
Заранее благодарим за любую помощь, которую вы можете предоставить
Ответы
Ответ 1
Воссоздание происходит только потому, что вы вынуждаете, вызывая setRequestedOrientation
, вероятно, для того, чтобы установить ориентацию экрана. Однако вам не нужно проверять и изменять его по коду. Вы можете сделать это через XML файл. Вы можете установить разные xml файлы в зависимости от размера экрана. Но это немного взломать, чтобы в будущем не было никакой гарантии.
В файле манифеста вы можете заставить:
<activity
android:name="com.my.example.MyActivity"
android:screenOrientation="landscape"/> // or portrait
Итак, насколько я понимаю, вы хотите заставить портрет для небольших размеров и ландшафта (или датчика) для большего размера экрана. Но выше настройки применяются для всех размеров экрана. Вот сложная часть: landscape
portrait
sensor
и т.д. Все целые числа определены здесь.
Как вы могли догадаться, вы можете написать android:screenOrientation=0
вместо landscape
. Что мы знаем из первых уроков андроида, мы можем определить целые числа в xml файлах, тогда их значения могут различаться по размеру экрана. Так..
Сначала вы должны создать разные файлы integers.xml
для разных размеров экрана. то есть:.
values
- integers.xml
values-large
- integers.xml
для values/integers.xml
:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<integer name="orientation">1</integer> // 1 for portrait
</resources>
для values-large/integers.xml
:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<integer name="orientation">0</integer> // 0 for landscape
</resources>
и, наконец, вам нужно манипулировать файлом манифеста с помощью:
<activity
android:name="com.my.example.MyActivity"
android:screenOrientation="@integer/orientation"/> // read constant from xml files
Вы также можете использовать опции sensor
, fullSensor
, nosensor
, locked
, behind
, reverseLandscape
, reversePortait
. Но я предупреждаю вас, это решение для взлома.
Ответ 2
Ну, я нашел решение этой проблемы, просто объявите:
android:screenOrientation="locked"
о каждом действии, имеющем эту проблему в манифесте.
И продолжайте использовать setRequestedOrientation()
программно, чтобы определить, является ли альбомная или книжная ориентация в методе onCreate()
,
Это будет работать! ;)
Ответ 3
попробуйте это в manifest.xml
...
это остановит вызов функции onCreate() несколько раз, пока изменения ориентации...
android:configChanges="keyboardHidden|orientation|screenSize"
Ответ 4
Вам не нужно обращаться с этим вручную. Android построил поддержку для разных размеров экрана
проверить эту ссылку
http://developer.android.com/training/multiscreen/screensizes.html
Ответ 5
Вы пытались добавить android:configChanges="keyboard|keyboardHidden|orientation"
в <activity>
-Tag внутри вашего AndroidManifest.xml?
Это должно помешать перезагрузке системы, но я не уверен, действительно ли это будет работать, если вы программно ориентируете ориентацию. Это стоит того, чтобы выстрелить.
Ответ 6
Если все ваши действия должны иметь одинаковую ориентацию на устройстве, вы можете запустить приложение с активностью заставки, установить ориентацию, как в вашем текущем коде, и переслать свою CoreActivity или любую другую активность в вашем приложении.
В вашем AndroidManifest.xml установленном
<activity
android:name=".CoreActivity"
android:screenOrientation="behind"/>
Это будет использовать ту же ориентацию, что и активность, которая непосредственно находится под ней в стеке действий.