런타임 중에 방향을 잠그는 방법


107

런타임 중에 방향을 잠그는 방법이 있습니까? 예를 들어 사용자가 현재 가로 모드에있는 경우 사용자가 화면을 가로로 잠그고 메뉴 옵션을 토글하도록 허용하고 싶습니다.

답변:


133
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

활동에서 호출되면 가로로 고정됩니다. ActivityInfo 클래스에서 다른 플래그를 찾으십시오. 다시 세로로 잠 그거나 센서 / 슬라이더 구동으로 만들 수 있습니다.

자세한 정보 : http://www.devx.com/wireless/Article/40792


13
알았어 고마워. 이것은 훌륭하게 작동합니다. 현재 방향을 얻게됩니다. getResources (). getConfiguration (). orientation
Jared

7
꼼꼼한! getConfiguration ()이 반환하는 것과 setRequestedOrientation이 원하는 것을 구별해야합니다. 자세한 내용은 아래 내 답변을 참조하십시오
Andy Weinstein

이 접근 방식에 문제가 있습니다. 이 답변
Bugs Happen

하지만 모든 활동에 대해 동일한 방향을 설정합니다. 방향을 변경할 수있는 다른 방법이
있습니까

106

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

13
사용자가 설정에서 화면 회전을 비활성화 한 경우 180도 뒤집기를 허용하지 않으므로 SCREEN_ORIENTATION_USER_LANDSCAPE를 사용하는 것이 좋습니다. 마찬가지로 자유 회전으로 다시 전환 할 때 SCREEN_ORIENTATION_USER가 SCREEN_ORIENTATION_SENSOR보다 낫습니다. 후자는 설정에서 허용하지 않는 경우에도 자유 회전을 허용합니다.
Steve Waring

훌륭한! 역방향으로 전환하면 재구성이 발생하지 않습니다. 적어도 내가 테스트 한 기기에서. 일부 대화 쇼 등에서 재구성을 중지하고 싶은지 아는 것이 정말 중요합니다
sberezin

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

잠금 해제 방향 :

   getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);

5
회전 "Returns the rotation of the screen from its "natural" orientation." 소스를 가져옵니다 . 따라서 ROTATION_0이 세로라고 말하는 휴대 전화에서는 정확할 수 있지만 태블릿에서는 '자연스러운'방향이 가로 일 가능성이 높고 ROTATION_0은 세로 대신 가로를 반환해야합니다.
jp36 2013 년

@ jp36, 휴대폰과 같은 자연스러운 방향을 가진 Nexus 7에서 테스트했습니다. 더 큰 태블릿 (내가 가지고 있지 않음)에서 테스트 해 주셔서 감사합니다.
pstoppani 2013 년

1
jp36이 말했듯이 자연스러운 가로 방향의 태블릿에서는 작동하지 않습니다!
DominicM

장치에서 반전 세로를 어떻게 테스트합니까 ??
AndyBoy

27

비슷한 경우가있는 것 같았습니다. 모든 오리엔테이션을 지원하고 싶었지만 워크 플로의 특정 지점 이후에 현재 오리엔테이션을 유지해야했습니다. 내 솔루션은 다음과 같습니다.

보호 된 워크 플로 시작시 :

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);

보호 된 워크 플로 종료시 :

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);

2
이것은 적어도 Android> = 16에서 OQ를 해결하지 않습니다. setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_NOSENSOR)은 기기가 세로로되어 있어도 가로로 설정할 수 있지만 질문은 주어진 방향 잠금을 참조합니다.
greg7gkb 2013

3
나에게 그것을 nosensor로 설정하면 내가 가로 모드에 있다면 세로 모드로 돌아갑니다. 대신 SCREEN_ORIENTATION_LOCKED를 사용했고 그것은 나를 위해 일했습니다
Jimmar 2014-08-31

1
@JiMMaR SCREEN_ORIENTATION_LOCKED는 Android> = 18을위한 가장 좋은 방법입니다.하지만 더 낮은 것을 목표로하는 경우에는 작동하지 않습니다. 아래 jp36의 답변을 사용하는 것이 좋습니다.
Patrick Boos 2015 년

23

태블릿을 지원하는 @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);
}

덕분에, 그것은 잘 작동 것 그러나 나는 이해하지 않았다 그것은 검사와 이유 ||rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_90와와 rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_270. 그래서 나는 두 가지 의심을 가지고 있습니다 :::: 첫째, 왜 두 번째 경우 ROTATION_0대신 왜 ROTATION_180그리고 다른 이유는 180이 아닌 90으로 0도를 확인 합니까 ?
AndyBoy

@AndyBoy는 장치의 기본 방향과 관련이 있습니다. 일반적으로 휴대 전화는 세로 방향의 기본 방향을 사용합니다. 즉, 세로 방향의 경우 회전이 0을 반환하지만 일부 태블릿에는 가로 방향의 경우 회전이 0을 반환하는 기본 가로 방향이 있습니다. 따라서 다른 ||검사는 가로 대 세로를보고하는 장치에 따라 가능한 두 가지 기본 방향을 처리합니다.
jp36

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

}

0

위의 @pstoppani 대답에 대한 Xamarin 변환은 다음과 같습니다.

참고 : 이것은 조각에 대한 것이므로 활동을 바꿉니다. 이. 활동 내에서 사용되는 경우.

public void LockRotation()
{
    ScreenOrientation orientation;

    var surfaceOrientation = Activity.WindowManager.DefaultDisplay.Rotation;

    switch (surfaceOrientation) {
        case SurfaceOrientation.Rotation0:
            orientation = ScreenOrientation.Portrait;
            break;
        case SurfaceOrientation.Rotation90:
            orientation = ScreenOrientation.Landscape;
            break;
        case SurfaceOrientation.Rotation180:
            orientation = ScreenOrientation.ReversePortrait;
            break;
        default:
            orientation = ScreenOrientation.ReverseLandscape;
            break;
    }

    Activity.RequestedOrientation = orientation;
}

public void UnlockRotation()
{
    Activity.RequestedOrientation = ScreenOrientation.Unspecified;
}

이것은 사용하기 전에 다른 접근 방식으로 진행된 것처럼 테스트되지 않았지만 유용 할 수 있습니다.


이것은 pstoppani와 동일한 대답이며 태블릿에서는 실패합니다.
Tim Autin 2017 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.