如何在运行时锁定方向

Jar*_*red 106 android orientation

有没有办法在运行时锁定方向?例如,如果用户当前处于横向状态并切换菜单选项,我想允许用户将屏幕锁定为横向.

has*_*man 127

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
Run Code Online (Sandbox Code Playgroud)

在某个活动上调用,会将其锁定为横向.查找ActivityInfo类中的其他标志.您可以将其锁定为纵向或使其传感器/滑块驱动.

更多信息:http://www.devx.com/wireless/Article/40792

  • 好,谢谢.这非常有效.这将获得当前的方向.getResources().getConfiguration().方向 (13认同)
  • 小心!您需要区分getConfiguration()返回的内容和setRequestedOrientation想要的内容 - 请参阅下面的答案以获取详细信息 (6认同)

And*_*ein 104

注意getConfiguration返回和setRequestedOrientation想要的区别 - 它们都是int,但它们来自不同的常量定义.

以下是如何锁定当前方向,同时允许180度翻转

int currentOrientation = getResources().getConfiguration().orientation;
if (currentOrientation == Configuration.ORIENTATION_LANDSCAPE) {
   setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
}
else {
   setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT);
}
Run Code Online (Sandbox Code Playgroud)

  • 您可能更喜欢使用SCREEN_ORIENTATION_USER_LANDSCAPE,因为如果用户在设置中禁用了屏幕旋转,则不允许180度翻转.同样,当切换回自由旋转时,SCREEN_ORIENTATION_USER优于SCREEN_ORIENTATION_SENSOR,因为后者允许自由旋转,即使设置说不是. (13认同)

pst*_*ani 47

这适用于具有反向纵向和反向横向的设备.

锁定方向:

    int orientation = getActivity().getRequestedOrientation();
    int rotation = ((WindowManager) getActivity().getSystemService(
            Context.WINDOW_SERVICE)).getDefaultDisplay().getRotation();
    switch (rotation) {
    case Surface.ROTATION_0:
        orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
        break;
    case Surface.ROTATION_90:
        orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
        break;
    case Surface.ROTATION_180:
        orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;
        break;
    default:
        orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
        break;
    }

    getActivity().setRequestedOrientation(orientation);
Run Code Online (Sandbox Code Playgroud)

解锁方向:

   getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
Run Code Online (Sandbox Code Playgroud)

  • 获取旋转""从"自然"方向返回屏幕的旋转."[source](http://developer.android.com/reference/android/view/Display.html#getRotation()).所以在手机上说ROTATION_0是肖像可能是正确的,但在平板电脑上它的"自然"方向可能是风景,而ROTATION_0应该返回横向而不是肖像. (5认同)

ste*_*ert 27

我好像有类似的情况.我想支持任何方向,但我需要在工作流程中的某个点之后保持当前方向.我的解决方案是:

在进入受保护的工作流程时:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
Run Code Online (Sandbox Code Playgroud)

退出受保护的工作流程时:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
Run Code Online (Sandbox Code Playgroud)

  • 对我来说,将它设置为nosensor会让我回到纵向模式,如果我在风景中我使用了SCREEN_ORIENTATION_LOCKED而它对我有效 (3认同)
  • 这并没有解决 OQ,至少在 Android >= 16 上。 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR) 可能会将设备设置为横向,即使它是纵向的,而问题是指给定的锁定方向。 (2认同)
  • @JiMMaR SCREEN_ORIENTATION_LOCKED 是 Android >= 18 的最佳方式。但如果你的目标较低,那就行不通了。我建议使用下面 jp36 的答案。 (2认同)

jp3*_*p36 22

替代@pstoppani回答支持平板电脑(与@pstoppani答案一样,这只适用于设备> 2.2) -
测试Samsung Galaxy SIIISamsung Galaxy Tab 10.1

public static void lockOrientation(Activity activity) {
    Display display = ((WindowManager) activity.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
    int rotation = display.getRotation();
    int tempOrientation = activity.getResources().getConfiguration().orientation;
    int orientation = 0;
    switch(tempOrientation)
    {
    case Configuration.ORIENTATION_LANDSCAPE:
        if(rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_90)
            orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
        else
            orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
        break;
    case Configuration.ORIENTATION_PORTRAIT:
        if(rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_270)
            orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
        else
            orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;
    }
    activity.setRequestedOrientation(orientation);
}
Run Code Online (Sandbox Code Playgroud)


mad*_*adx 5

这是我的代码,您可以使用其中一种方法锁定屏幕,一旦完成任务,使用unlockOrientation解锁它:

/** Static methods related to device orientation. */
public class OrientationUtils {
    private OrientationUtils() {}

    /** Locks the device window in landscape mode. */
    public static void lockOrientationLandscape(Activity activity) {
        activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_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 (!BuildVersionUtils.hasGingerbread()) {
            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);
    }

}
Run Code Online (Sandbox Code Playgroud)