Как настроить все приложение только в портретном режиме?

201

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

Naresh
источник

Ответы:

293

Для любой версии Android

Из XML

Вы можете указать android:screenOrientation="portrait"для каждого действия в вашем файле manifest.xml. Вы не можете указать эту опцию в applicationтеге.

С Java

Другой вариант - сделать это программно, например, в Activityбазовом классе:

@Override
public void onCreate(Bundle savedInstanceState) {
  setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}

Для Android 4+ (API 14+)

Последний вариант - сделать это со слушателями жизненного цикла активности, которые доступны только с Android 4.0 (API 14+). Все происходит в пользовательском Applicationклассе:

@Override
public void onCreate() {
    super.onCreate();  
    registerActivityLifecycleCallbacks(new ActivityLifecycleAdapter() {
        @Override
        public void onActivityCreated(Activity a, Bundle savedInstanceState) {
            a.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        }
    });
}

ActivityLifecycleAdapterэто просто вспомогательный класс, который вам нужно создать, который будет пустой реализацией ActivityLifecycleCallbacks(поэтому вам не нужно переопределять все методы этого интерфейса, когда вам просто нужен один из них).

Винсент Мимун-Прат
источник
1
это не работает. он поворачивается в ландшафтный режим, когда я повернул устройство. и многое другое в коде я использую эти setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_NOSENSOR); setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_SENSOR); Инструкция для индикатора выполнения. есть какие-то проблемы с этими инструкциями?
Нареш
это работает. еще одна вещь, не помещайте выше две инструкции в вашей части кодирования. это означает, что он позволяет сенсору изменять ориентацию экрана.
Нареш
3
-1: Аскер специально спросил, как это сделать // программно // и для всего приложения (что заставляет меня думать, что они не хотят делать это для каждого действия в отдельности).
jwir3
@ jwir3, я не согласен. «программирование» - это не просто написание кода, это также все метафайлы, используемые вами ресурсы, работа с особенностями среды IDE и т. д. Это хороший ответ, устраняет проблему, и ОП помечает ее как правильную по-видимому, достаточный ответ на оригинальный вопрос.
Джеймс Вебстер
9
Используя метод LifeCycleCallbacks, у вас будет задержка запуска активности, когда вы держите свое устройство в (как это обычно бывает) ландшафтном режиме. Я предполагаю, что это потому, что устройства возвращаются в ландшафтный режим на короткое время между действиями и им нужно время, чтобы справиться с этим. Установка ориентации в манифесте не имеет этого эффекта.
Аноним
142

Да, вы можете делать это как программно, так и для всех ваших действий, создавая AbstractActivity, который расширяет все ваши действия.

public abstract class AbstractActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    }
}

Эта абстрактная деятельность также может быть использована для глобального меню.

Ян-Терье Соренсен
источник
3
Примечание: я считаю, что это ActivityInfo.SCREEN_ORIENTATION_NOSENSORдолжен быть лучший ответ, потому что он предназначен для того, чтобы оставить устройство в состоянии по умолчанию, потому что некоторые устройства не имеют книжной ориентации. Однако «nosensor» НЕ работает для меня, поэтому ответ @ arcone означает меня.
Дэвид Мэнпирл
104

Вы можете сделать это для всего приложения, не заставляя все ваши действия расширять общий базовый класс.

Сначала нужно убедиться, что вы включили Applicationподкласс в свой проект. В своей программе onCreate(), которая вызывается при первом запуске приложения, вы регистрируете ActivityLifecycleCallbacksобъект (уровень API 14+) для получения уведомлений о событиях жизненного цикла активности.

Это дает вам возможность выполнять свой собственный код всякий раз, когда какая-либо активность в вашем приложении запускается (или останавливается, или возобновляется, или как угодно). На данный момент вы можете позвонить setRequestedOrientation()на вновь созданную деятельность.

class MyApp extends Application {

    @Override
    public void onCreate() {
        super.onCreate();  

        // register to be informed of activities starting up
        registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {

            @Override
            public void onActivityCreated(Activity activity, 
                                          Bundle savedInstanceState) {

                // new activity created; force its orientation to portrait
                activity.setRequestedOrientation(
                    ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

            }

            ....

        });

    }
}
Грэм Борланд
источник
9
это единственный ответ, который касается вопроса. Одна строка, чтобы править ими всеми.
Самуил
2
* Один класс, чтобы управлять ими всеми.
Джей Маю
3
и никогда не забывайте добавлять в манифест приложение root. android: name = ". MyApp"
Faisal Naseer
2
Этот подход вызывает onCreate () действия дважды.
Сандип Р
3
Проблема в том, что когда вы держите устройство горизонтально и начинаете новое действие, оно отображается в горизонтальной ориентации, а затем поворачивается в портретную ориентацию. Похоже, что единственный хороший способ заблокировать полное приложение в портретной ориентации - пометить каждую активность в манифесте.
День
42

Вы можете установить это в своем файле манифеста ..

android:name=".your launching activity name"
android:screenOrientation="portrait"

и вы также можете добиться того же, написав код в вашем файле класса, например:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
SRAM
источник
1
@ naresh Пожалуйста, примите ответ, если у вас есть какое-либо решение в соответствии с вашими потребностями, это также повлияет на ваш рейтинг
SRam
24

Добавьте android: screenOrientation = "Portrait" к действию в AndroidManifest.xml. Например:

<activity android:name=".SomeActivity"
    android:label="@string/app_name"
    android:screenOrientation="portrait">
Никунь Патель
источник
25
Он сказал, что приложение, а не деятельность.
Райнхерд
10

Использование:

android:screenOrientation="portrait" 

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

Дипак Шарма
источник
8

Запишите это в свой файл манифеста для каждого вида деятельности:

android:screenOrientation="portrait" 
Zwiebel
источник
2

Как из руководства разработчика Android:

«Ориентация» Ориентация экрана изменилась - пользователь повернул устройство. Примечание. Если ваше приложение предназначено для уровня API 13 или выше (как заявлено атрибутами minSdkVersion и targetSdkVersion), вам также следует объявить конфигурацию «screenSize», поскольку она также изменяется, когда устройство переключается между книжной и альбомной ориентациями.

"screenSize" Текущий доступный размер экрана изменился. Это представляет изменение доступного в настоящее время размера относительно текущего соотношения сторон, поэтому оно изменится, когда пользователь переключается между альбомным и портретным режимами. Однако, если ваше приложение предназначено для уровня API 12 или ниже, то ваша активность всегда сама обрабатывает это изменение конфигурации (это изменение конфигурации не перезапускает вашу активность, даже при работе на устройстве Android 3.2 или выше). Добавлено в API уровень 13.

Итак, в файле AndroidManifest.xml мы можем поместить:

<activity
            android:name=".activities.role_activity.GeneralViewPagerActivity"
            android:label="@string/title_activity_general_view_pager"
            android:screenOrientation="portrait"
            android:configChanges="orientation|keyboardHidden|screenSize"
            >
        </activity> 
super1ha1
источник
1

Добавление <preference name="orientation" value="portrait" />под <widget>в моем config.xml работал для меня.

(Другие решения не работали на моем устройстве, были перезаписаны во время сборки или выдавали ошибки устаревания во время процесса сборки.)

Филипп
источник
Где находится указанный config.xml? Какую платформу разработки вы имеете в виду?
Таш Пемхива
1

В файле манифеста, какое действие вы хотите использовать в «портрете», вы должны написать этот код в теге «Деятельность».

  android:screenOrientation="portrait" 

как это

         android:icon="@drawable/icon"
        android:name="com.zemkoapps.hd.wallpaper.AndroidGridLayoutActivity" 
        android:screenOrientation="portrait" >

но если вы хотите экран в ландшафте, используйте этот код, как это

android:screenOrientation="landscape"
Билал Джаррал
источник
1
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


    //setting screen orientation locked so it will be acting as potrait
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED);
}
Эмон Хоссейн Мунна
источник
0

Если кому-то интересно, как вы могли бы сделать это для всего приложения, не заставляя все ваши действия расширять общий базовый класс в Kotlin , см. Пример ниже:

class InteractiveStoryApplication: Application() {
override fun onCreate() {
    super.onCreate()
    registerActivityLifecycleCallbacks(object: ActivityLifecycleCallbacks {
        override fun onActivityCreated(activity: Activity?, savedInstanceState: Bundle?) {
            activity?.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
        }

        override fun onActivityPaused(activity: Activity?) {
        }

        override fun onActivityResumed(activity: Activity?) {
        }

        override fun onActivityDestroyed(activity: Activity?) {
        }

        override fun onActivitySaveInstanceState(activity: Activity?, outState: Bundle?) {
        }

        override fun onActivityStarted(activity: Activity?) {
        }

        override fun onActivityStopped(activity: Activity?) {
        }
    })
}
}

а затем вы должны добавить свой общий базовый класс в AndroidManifest следующим образом:

<application android:allowBackup="true"
android:name=".InteractiveStoryApplication"
Ashildr
источник
0

Вы можете сделать это двумя способами.

  1. Добавить android:screenOrientation="portrait" в свой файл манифеста к соответствующей деятельности
  2. Добавьте setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); к своей деятельности в методе `onCreate ()
Saneesh
источник
0

Аналогично ответу Грэма Борланда ... но, кажется, вам не нужно создавать класс Application, если вы не хотите ... просто создайте базовую активность в своем проекте

public class BaseActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_base);
    setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

}

И расширить этот класс вместо AppCompatActivity, где вы хотите использовать режим Potrait.

public class your_activity extends BaseActivity {}
Рактим Бхаттачарья
источник
0

Для пользователей Xamarin:

Если вы расширяете все свои действия на BaseActivityПросто добавьте:

this.RequestedOrientation = ScreenOrientation.Portrait;

Это решит проблему. Если вы хотите, чтобы какая-то конкретная деятельность была в ландшафте, переопределите это в OnActivityCreated. Так как:

this.Activity.RequestedOrientation = ScreenOrientation.Landscape;
Nawin
источник
-11

В своем манифесте введите это:

<activity
    android:screenOrientation="portrait"
    <!--- Rest of your application information ---!>
</activity>
Тайс Гейтс
источник
6
Это не добавляет ничего нового, что 3-летние ответы еще не сказали. Вы можете рассмотреть возможность его удаления. Если вы решите отредактировать свой ответ, включив в него дополнительную информацию, которая отличает ваш ответ от других, пожалуйста, @ ответьте мне.
Artjom B.
1
android: screenOrientation = "портрет" не может быть добавлен в тег приложения, он должен идти внутри тега активности
Hossein Amini