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