如何仅将整个应用程序设置为纵向模式?


201

如何设置它,使应用程序仅在纵向模式下运行?我希望在应用程序运行时禁用横向模式。如何以编程方式进行?

Answers:


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); 进度栏说明。这些说明有什么问题吗?
naresh 2011年

它正在工作。还有一件事情不要在您的编码部分的两个指令之上。这意味着它使传感器能够更改屏幕方向。
naresh 2011年

3
-1:询问者特别要求如何//以编程方式//以及整个应用程序的操作(这使我相信他们不想针对每个活动单独进行操作)。
jwir3 2014年

@ jwir3,我不同意。“编程”不仅是编写代码,还包括所有元文件,您使用的资源,解决IDE的特质等问题。这是一个很好的答案,可以解决此问题 OP将其标记为正确,因此显然足以解决原始问题。
James Webster

9
使用LifeCycleCallbacks方法,当您将设备保持在(通常是)横向模式时,活动启动会有延迟。我猜这是因为设备在活动之间短暂返回到风景模式,并且需要时间来处理。在清单中设置方向不会产生此效果。
匿名2015年

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的答案代表了我。
David Manpearl 2014年

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
这是解决该问题的唯一答案。一线统治他们。
塞缪尔2015年

2
*一堂课来统治他们。
杰·马尤

3
并且永远不要忘记添加清单应用程序root。android:name =“。MyApp”
Faisal Naseer's

2
此方法两次调用活动的onCreate()。
Sandeep R

3
问题是当您水平握住设备并开始新活动时,它以横向显示,然后旋转为纵向。似乎将整个应用锁定为纵向的唯一好方法是标记Manifest中的所有活动。

42

您可以在清单文件中进行设置。

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

并且您还可以通过在类文件中编写代码来达到相同的目的:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

1
@ naresh pls接受ans如果您根据您的需要有任何解决方案,它也会提高您的评级
SRam 2011年

24

将android:screenOrientation =“ portrait”添加到AndroidManifest.xml中的活动。例如:

<activity android:name=".SomeActivity"
    android:label="@string/app_name"
    android:screenOrientation="portrait">

25
他说APPLICATION没有活动。
2013年


8

对于每个活动,将其写入清单文件:

android:screenOrientation="portrait" 

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> 

1

在我的config.xml中添加<preference name="orientation" value="portrait" /><widget>对我有用。

(其他解决方案在我的设备上不起作用,在构建过程中被覆盖,或者在构建过程中出现了弃用错误。)


所说的config.xml在哪里?您指的是什么开发平台?
Tash Pemhiwa

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"

0

您可以通过两种方式进行操作。

  1. android:screenOrientation="portrait"清单文件添加 到相应的活动
  2. setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 通过onCreate()方法添加 到您的活动中

0

与Graham Borland的答案类似...但是,如果您不想,则不必创建Application类。只需在项目中创建一个Base Activity

public class BaseActivity extends AppCompatActivity {

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

}

并在要使用Potrait模式的地方扩展此类,而不是AppCompatActivity

public class your_activity extends BaseActivity {}

0

对于Xamarin用户:

如果您将所有活动扩展到“ BaseActivity仅添加”:

this.RequestedOrientation = ScreenOrientation.Portrait;

这样可以解决问题。如果您希望任何特定的活动处于横向状态,请在中进行覆盖OnActivityCreated。如:

this.Activity.RequestedOrientation = ScreenOrientation.Landscape;

-11

在清单中输入:

<activity
    android:screenOrientation="portrait"
    <!--- Rest of your application information ---!>
</activity>

6
这并没有增加3年以上答案尚未说的新内容。您可以考虑删除它。如果您决定编辑答案以包含更多信息,以区别于其他答案,请@回复我。
Artjom B.

1
android:screenOrientation =“ portrait”无法添加到应用程序标签中,它必须放在活动标签中
Hossein Amini 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.