Как изменить ориентацию экрана, не создавая новую активность на 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"

Ответ 5

Вы пытались добавить android:configChanges="keyboard|keyboardHidden|orientation" в <activity> -Tag внутри вашего AndroidManifest.xml?

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

Ответ 6

Если все ваши действия должны иметь одинаковую ориентацию на устройстве, вы можете запустить приложение с активностью заставки, установить ориентацию, как в вашем текущем коде, и переслать свою CoreActivity или любую другую активность в вашем приложении.

В вашем AndroidManifest.xml установленном

<activity
    android:name=".CoreActivity"
    android:screenOrientation="behind"/>

Это будет использовать ту же ориентацию, что и активность, которая непосредственно находится под ней в стеке действий.