强制“竖屏”方向模式

325

我试图强制使我的应用程序保持“纵向”模式,因为我的应用程序绝不是为“横向”模式设计的。

在阅读了一些论坛后,我在清单文件中添加了以下几行:

<application 
  android:debuggable="true"
  android:icon="@drawable/icon" 
  android:label="@string/app_name"
  android:screenOrientation="portrait">

但是它在我的设备上(HTC Desire)不起作用。它会从“纵向”切换到“横向”,忽略清单文件中的行。

阅读更多论坛后,我尝试在我的清单文件中添加以下内容:

<application 
  android:debuggable="true"
  android:icon="@drawable/icon" 
  android:label="@string/app_name"
  android:configChanges="orientation"       
  android:screenOrientation="portrait">

还有这个在我的Activity类中的函数:

public void onConfigurationChanged(Configuration newConfig)
{
    super.onConfigurationChanged(newConfig);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}

但是,再次尝试,仍然没有成功。

12个回答

572
不要将方向应用到 application 元素上,而是应该将属性应用到 activity 元素上,并且您还必须按照下面的说明设置 configChanges

示例:

<activity
   android:screenOrientation="portrait"
   android:configChanges="orientation|keyboardHidden">
</activity>

这是应用在清单文件AndroidManifest.xml中的。


36
configChanges 是用来做什么的? - Dror
80
@Orchestrator,configChanges 意味着活动本身处理配置更改。如果没有它,如果有方向更改,则活动将重新启动。你可能会问,如果已指定方向为“竖屏”,它如何改变? 如果启动另一个更改方向的活动,那么该新活动退出并返回到您的活动,则方向可能会更改。例如,在某些方向上,三星Galaxy S3 上的默认图像捕获意图就是这样做的。 - Gordon McCreight
2
@GordonMcCreight,您能否用一个真实的例子来解释一下这个问题:“如果您已经指定了方向为“纵向”,那么它怎么会改变呢?如果启动另一个更改方向的活动,然后该新活动退出,将您带回到您的活动中,方向就会改变。” - Tushar Pandey
4
当然,@TusharPandey。如果我没记错的话,这个问题曾经在我们的应用程序在三星Galaxy S3上启动默认图像捕获意图时引起了麻烦。基本上,我们只想拍张照片并获取结果。然而,当相机意图返回时,它导致了方向改变,并清除了我们活动中的状态,因为我们认为不需要防范这种情况(考虑到我们的整个应用程序始终只处于“纵向”方向)。三星Galaxy S3之所以会这样做的原因和方式超出了我的(尽管有限)理解范围。 - Gordon McCreight
12
为什么要包括 "keyboardHidden"? - gonzobrains
显示剩余5条评论

26
请问需要翻译的内容是什么?
android:screenOrientation="portrait"     
android:configChanges="orientation|keyboardHidden"

在定义活动的清单文件中添加。


15

如果您的应用程序中有很多类似于我的活动,或者您不想为清单中的每个活动标记输入代码,则可以这样做。

在您的Application基类中,您将获得一个生命周期回调。

所以基本上,在Application类中创建每个活动时会触发onCreate,在这里是代码...

public class MyApplication extends Application{

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

  registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
            @Override
            public void onActivityCreated(Activity activity, Bundle bundle) {
                activity.setRequestedOrientation(
                        ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);


// for each activity this function is called and so it is set to portrait mode


            }

            @Override
            public void onActivityStarted(Activity activity) {

            }

            @Override
            public void onActivityResumed(Activity activity) {

            }

            @Override
            public void onActivityPaused(Activity activity) {

            }

            @Override
            public void onActivityStopped(Activity activity) {

            }

            @Override
            public void onActivitySaveInstanceState(Activity activity, Bundle bundle) {

            }

            @Override
            public void onActivityDestroyed(Activity activity) {

            }
        });
}

我希望这可以帮到你。


1
高效的答案!这应该是正确的答案,特别是对于那些开发依赖大量Activity的复杂应用程序的人来说。 - FEBRYAN ASA PERDANA

14
我认为 android:screenOrientation="portrait" 可以用于单个活动。因此,可以在 <activity> 标签中使用该属性,例如:
<activity android:name=".<Activity Name>"
    android:label="@string/app_name" 
    android:screenOrientation="portrait">
   ...         
</activity>

13

设置强制竖屏或横屏模式,分别添加以下行。

导入以下行:

import android.content.pm.ActivityInfo;
setContentView(R.layout.activity_main); 上方添加以下行:
对于纵向模式:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//Set Portrait

对于景观设计

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//Set Landscape

这肯定会起作用。


1
在某些设备上,使用Android 9会出现问题 - 即使您仅使用PORTRAIT,屏幕旋转转换也会在短暂的时刻可见。 - Igor
如果可能的话,您能否请指定您遇到问题的设备信息? - Parth Patel
@ParthPatel 华为 YAL-L21,Android:10(SDK:29) - Alex Smith

4
根据Android文档,您还应该经常将screenSize作为可能的配置更改项之一。
android:configChanges="orientation|screenSize"

如果您的应用程序针对API 13或更高版本(由minSdkVersion和targetSdkVersion属性声明),则您还应声明“screenSize”配置,因为当设备在纵向和横向方向之间切换时,它也会发生变化。 此外,如果您在示例中都包含value键盘隐藏,则是否也应考虑locale、mcc、fontScale、keyboard和其他内容?

3

我在AndroidManifest.xml文件中有这行代码

<activity 
    android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale"
    android:label="@string/app_name" android:name="Project Name"
    android:theme="@android:style/Theme.Black.NoTitleBar">

我将其更改为(只是添加了android:screenOrientation="portrait"
<activity 
    android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale"
    android:label="@string/app_name" android:name="Project Name"
    android:screenOrientation="portrait"
    android:theme="@android:style/Theme.Black.NoTitleBar">

这对我解决了问题。

2

补充一些内容:我最近更新了一个应用程序,之前的版本可以在横向和纵向模式下工作,我希望更新后的版本只能在纵向模式下工作,所以我添加了

android:screenOrientation="portrait"

我在测试更新时,将代码添加到相应的活动中,结果程序崩溃了。

android:configChanges="orientation|keyboardHidden"

同样的,它也可以运行。


1
如果这不是问题的答案,将其作为评论添加可能会有帮助。 - JPReddy
请检查您是否将其添加到活动而不是应用程序块中。 - Mikhail Valuyskiy

2

如果您希望在debugrelease版本中支持不同的屏幕方向,请按照以下步骤操作(请参见https://developer.android.com/studio/build/gradle-tips#share-properties-with-the-manifest)。

在您的app文件夹下的build.gradle中编写如下代码:

android {
    ...
    buildTypes {
        debug {
            applicationIdSuffix '.debug'
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            // Creates a placeholder property to use in the manifest.
            manifestPlaceholders = [orientation: "fullSensor"]
        }
        release {
            debuggable true
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            // Creates a placeholder property to use in the manifest.
            manifestPlaceholders = [orientation: "portrait"]
        }
    }
}

然后在AndroidManifest中,您可以在任何Activity中使用这个变量"orientation":

<activity
    android:name=".LoginActivity"
    android:screenOrientation="${orientation}" />

您可以添加android:configChanges
在调试中,manifestPlaceholders = [configChanges: "", orientation: "fullSensor"],而在发布中manifestPlaceholders = [configChanges: "keyboardHidden|orientation|screenSize", orientation: "portrait"]
<activity
    android:name=".LoginActivity"
    android:configChanges="${configChanges}"
    android:screenOrientation="${orientation}" />

1

我认为你想要在你的活动中添加android:configChanges="orientation|keyboardHidden"?否则,活动将在配置更改时重新启动。这时onConfigurationChanged不会被调用,只有onCreate会被调用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接