2014-11-19 3 views
3

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

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

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

+0

Деятельность всегда воссоздавалась после изменения ориентации. – Suvitruf

+0

мой ответ работал на вас? : http://stackoverflow.com/a/27015879/1281930 – guness

ответ

11

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

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

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

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

+0

Это действительно установило ориентацию экрана, к сожалению, он установил его для ВСЕХ размеров экрана, моя проблема что я хочу различную ориентацию для разных размеров экрана для большинства действий и одну и ту же ориентацию для одной активности, из того, что я искал, нет способа сделать это через androidmanifest – Cruces

+0

@Cruces check now mate. это мат. – guness

+1

yep, что кажется ТОЧНО, что я хочу сделать, спасибо многому человеку, который действительно помог также это не похоже на взломочное решение, намного чище, чем configChanges, и все и их мать предупреждают меня об использовании configChanges – Cruces

0

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

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

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

+0

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

0

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

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

+0

Нет, мне жаль, что это не похоже на работа, она по-прежнему разрушает первоначальную активность и перезапускает активность из oncreate – Cruces

1

попробовать это в вашем manifest.xml ... это остановит ссылаясь на OnCreate() несколько раз, в то время как ориентация меняется ...

android:configChanges="keyboardHidden|orientation|screenSize" 
+0

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

+0

в моем случае это прекрасно работает ..., попробуйте, если это подходит с вашим требованием, дайте оценку .. –

+0

Да, это действительно работает, но из того, что я исследовал, configChanges - это нечто вроде нечего менять, все еще прочное решение, спасибо – Cruces

0

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

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

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

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

+0

не совсем то, что я искал, но я никогда не знал о «отставании», ориентация, спасибо – Cruces

Смежные вопросы