如何在Android中禁用横屏模式?

1055

如何在我的Android应用程序中禁用某些视图的横向模式?


3
你是在试图禁用自动旋转功能吗?尝试在竖屏视图下设置你偏好的方向。参考链接:http://code.google.com/android/reference/android/R.styleable.html#AndroidManifestActivity_screenOrientation - adam
32个回答

7
将其放入清单文件中。
<activity
    android:name=".MainActivity"
    android:label="@string/app_name"
    android:screenOrientation="sensorPortrait" />

屏幕方向将为纵向,但如果用户的手机颠倒了,它也会正确显示。(因此你的屏幕会旋转180度。)


如果活动在多窗口模式下运行,则系统将忽略此属性。

更多信息:https://developer.android.com/guide/topics/manifest/activity-element


关于“此属性”:是哪个属性?它指的是什么? - Peter Mortensen
“this attribute” 指的是 “screenOrientation” 属性。 - Marci
1
我添加了android:resizeableActivity="false",但是屏幕仍然不能颠倒... - swalkner

7
只需在您的活动标签中添加此属性。
 android:screenOrientation="portrait"

为什么之前的答案都这么简单?例如,这是否取决于Android版本? - Peter Mortensen

7
android:screenOrientation="portrait"添加到想要禁用横屏模式的活动中。

7
如果您不想在每个活动的清单条目中添加方向,最好创建一个BaseActivity类(继承“Activity”或“AppCompatActivity”),该类将由应用程序的每个活动继承,而不是继承“Activity”或“AppCompatActivity”,并只需在您的BaseActivity中添加以下代码即可:
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    // rest of your code......
}

实现继承? - Peter Mortensen

6

如何在一些视图中更改方向

不必锁定整个活动的方向,您可以使用此类动态地从任何视图实用地锁定方向:

将您的视图设置为横屏

OrientationUtils.lockOrientationLandscape(mActivity);

让您的视图呈现竖屏模式

OrientationUtils.lockOrientationPortrait(mActivity);

解锁屏幕方向

OrientationUtils.unlockOrientation(mActivity);

方向工具类
该工具类用于处理方向相关的操作。
import android.app.Activity;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.os.Build;
import android.view.Surface;
import android.view.WindowManager;

/*  * This class is used to lock orientation of android app in nay android devices
 */

public class OrientationUtils {
    private OrientationUtils() {
    }

    /** Locks the device window in landscape mode. */
    public static void lockOrientationLandscape(Activity activity) {
        activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
    }

    /** Locks the device window in portrait mode. */
    public static void lockOrientationPortrait(Activity activity) {
        activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    }

    /** Locks the device window in actual screen mode. */
    public static void lockOrientation(Activity activity) {
        final int orientation = activity.getResources().getConfiguration().orientation;
        final int rotation = ((WindowManager) activity.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay()
                .getRotation();

        // Copied from Android docs, since we don't have these values in Froyo
        // 2.2
        int SCREEN_ORIENTATION_REVERSE_LANDSCAPE = 8;
        int SCREEN_ORIENTATION_REVERSE_PORTRAIT = 9;

        // Build.VERSION.SDK_INT <= Build.VERSION_CODES.FROYO
        if (!(Build.VERSION.SDK_INT <= Build.VERSION_CODES.FROYO)) {
            SCREEN_ORIENTATION_REVERSE_LANDSCAPE = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
            SCREEN_ORIENTATION_REVERSE_PORTRAIT = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
        }

        if (rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_90) {
            if (orientation == Configuration.ORIENTATION_PORTRAIT) {
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            } else if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
            }
        } else if (rotation == Surface.ROTATION_180 || rotation == Surface.ROTATION_270) {
            if (orientation == Configuration.ORIENTATION_PORTRAIT) {
                activity.setRequestedOrientation(SCREEN_ORIENTATION_REVERSE_PORTRAIT);
            } else if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
                activity.setRequestedOrientation(SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
            }
        }
    }

    /** Unlocks the device window in user defined screen mode. */
    public static void unlockOrientation(Activity activity) {
        activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_USER);
    }

}

关于“实用主义”:你是指“程序化”吗?(这不是一个修辞问题) - Peter Mortensen

5

您需要设置每个活动的方向。

<activity
    android:name="com.example.SplashScreen2"
    android:label="@string/app_name"
    android:screenOrientation="portrait"
    android:theme="@android:style/Theme.Black.NoTitleBar" >
</activity>
<activity
    android:name="com.example.Registration"
    android:label="@string/app_name"
    android:screenOrientation="portrait"
    android:theme="@android:style/Theme.Black.NoTitleBar" >
</activity>
<activity
    android:name="com.example.Verification"
    android:label="@string/app_name"
    android:screenOrientation="portrait"
    android:theme="@android:style/Theme.Black.NoTitleBar" >
</activity>
<activity
    android:name="com.example.WelcomeAlmostDone"
    android:label="@string/app_name"
    android:screenOrientation="portrait"
    android:theme="@android:style/Theme.Black.NoTitleBar" >
</activity>
<activity
    android:name="com.example.PasswordRegistration"
    android:label="@string/app_name"
    android:screenOrientation="portrait"
    android:theme="@android:style/Theme.Black.NoTitleBar" >
</activity>

5

如果您正在使用Xamarin C#,其中一些解决方案可能不适用。这是我发现可行的解决方案。

[Activity(MainLauncher = true, Icon = "@drawable/icon", ScreenOrientation = ScreenOrientation.Portrait)]

以上代码在类中运行良好,类似于其他解决方案。此外,它并不是全局适用的,需要放置在每个活动标题中。


“Above the class works well” 是什么意思? - Peter Mortensen

5

使用:

android:configChanges="keyboardHidden|orientation"
android:screenOrientation="portrait" 

需要解释一下。例如,这个想法/主旨是什么?它与之前的答案有何不同/优势? - Peter Mortensen

4

可以在清单文件中的类中实现:

<activity android:name=".yourActivity"
    ....
    android:screenOrientation="portrait" />

或者通过编程实现:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

注意:onCreate()方法中,在调用setContentView之前,应该先调用这个方法。


@PeterMortensen 按下ctrl+N,然后输入manifest。 - Khemraj Sharma

4
在onCreate()方法中添加一个类:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

那怎么添加一个类呢? - Peter Mortensen

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