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

问题描述 投票:191回答:15

如何设置它以便应用程序仅以纵向模式运行?我希望在应用程序运行时禁用横向模式。我该如何以编程方式执行此操作?

android
15个回答
287
投票

For any Android version

From XML

您可以为manifest.xml文件中的每个活动指定android:screenOrientation="portrait"。您无法在application标记上指定此选项。

From Java

其他选项是以编程方式执行,例如在Activity基类中:

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

For 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
投票

在Manifest文件中,您要在“纵向”中使用哪个活动,您必须在Activity标记中编写这些代码

  android:screenOrientation="portrait" 

像这样

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

但如果你想在横向屏幕中使用这样的代码

android:screenOrientation="landscape"

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. 在`onCreate()方法中将setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);添加到您的活动中

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);

}

并且在您要使用纵向模式的地方扩展此类而不是AppCompatActivity

public class your_activity extends BaseActivity {}

0
投票

对于Xamarin用户:

如果您将所有活动扩展到BaseActivity只需添加:

this.RequestedOrientation = ScreenOrientation.Portrait;

这将解决问题。如果您希望在OnActivityCreated中将任何特定活动置于横向覆盖中。如:

this.Activity.RequestedOrientation = ScreenOrientation.Landscape;

-11
投票

在你的Manifest中输入:

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

137
投票

是的,您可以通过编程方式和所有活动进行所有活动扩展的抽象活动。

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

此抽象活动也可用于全局菜单。


93
投票

您可以为整个应用程序执行此操作,而无需使所有活动扩展为公共基类。

首先要确保在项目中包含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);

            }

            ....

        });

    }
}

40
投票

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

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

你也可以通过在类文件中编写代码来实现相同的目的:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

24
投票

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

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

10
投票

使用:

android:screenOrientation="portrait" 

只需在要在纵向模式下显示的每个活动的应用程序清单文件中写下此行。


8
投票

将此内容写入您的清单文件,以用于每项活动:

android:screenOrientation="portrait" 

2
投票

从Android开发人员指南:

“orientation”屏幕方向已更改 - 用户已旋转设备。注意:如果您的应用程序的目标是13级或更高级别的API(由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>对我有用。

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

© www.soinside.com 2019 - 2024. All rights reserved.