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

Есть ли способ избежать этой проблемы? Есть ли способ запустить действие с самого начала в портретном режиме и не изменить его, или он не создает дважды?

Заранее благодарим за любую помощь, которую вы можете предоставить

6 ответов

Решение

Воссоздание происходит только потому, что вы заставляете, позвонив setRequestedOrientation вероятно, для того, чтобы установить ориентацию экрана. Однако вам не нужно проверять и изменять его по коду. Вы можете сделать это через XML-файл. Вы можете установить различные файлы XML в зависимости от размера экрана. Но это немного взломать, поэтому нет никаких гарантий в будущем.

В файле манифеста вы можете принудительно:

<activity
   android:name="com.my.example.MyActivity"
   android:screenOrientation="landscape"/>  // or portrait

Итак, насколько я понимаю, вы хотите использовать портрет для небольших размеров и пейзаж (или датчик) для больших размеров экрана. Но приведенная выше конфигурация применима для всех размеров экрана. Вот сложная часть: landscapeportraitsensor и т.д. все целые числа, определенные здесь. Как вы можете догадаться, вы можете написать android:screenOrientation=0 вместо landscape, Что мы знаем из первых уроков Android, мы можем определить целые числа в файлах 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 варианты тоже. Но я предупреждаю вас, это решение взломать.

Ну, я нашел решение этой проблемы, просто объявить:

android:screenOrientation="locked"

на каждую деятельность, заявленную в манифесте с этим вопросом.

И продолжайте использовать setRequestedOrientation() программно определить, если альбомная или книжная ориентация в пределах onCreate() метод,

Может быть, это помогает

Попробуйте это в вашем manifest.xml... это остановит повторный вызов onCreate() во время изменения ориентации...

android:configChanges="keyboardHidden|orientation|screenSize"

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

В вашем наборе AndroidManifest.xml

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

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

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

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

Вам не нужно обрабатывать это вручную. В Android встроена поддержка разных размеров экрана

проверьте эту ссылку

http://developer.android.com/training/multiscreen/screensizes.html

Другие вопросы по тегам