実行時に方向をロックする方法


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

しかし、すべてのアクティビティに同じ向きを設定します。向きを変更できる他の方法はありますか
silverFoxA

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
SCREEN_ORIENTATION_USER_LANDSCAPEを使用することをお勧めします。これは、ユーザーが設定で画面の回転を無効にしている場合、180度の反転が許可されないためです。同様に、フリーローテーションに切り替える場合、SCREEN_ORIENTATION_USERはSCREEN_ORIENTATION_SENSORよりも優れています。後者は、設定で許可されていない場合でもフリーローテーションを許可するためです。
Steve Waring 2014

鮮やかさ!逆方向に切り替えるときに追加する必要があります。再構成は行われません。少なくとも私がテストしたデバイスでは。一部のダイアログショーなどで再構成を停止するかどうかを知ることは非常に重要です
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

@ jp36、電話と同じ自然な向きのNexus 7でテストしました。より大きなタブレット(私は持っていません)でテストしていただきありがとうございます。
pstoppani 2013年

1
jp36が言ったように、それは自然な横向きのタブレットでは動作しません!
DominicM 2015

デバイスで逆ポートレートをテストするにはどうすればよいですか?
AndyBoy

27

似たような事件があったようです。任意の向きをサポートしたかったのですが、ワークフローの特定のポイントの後で現在の向きを維持する必要がありました。私の解決策は:

保護されたワークフローの開始時:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);

保護されたワークフローの終了時:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);

2
これは、少なくともAndroid> = 16では、OQに対応していません。setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR)は、デバイスが縦向きであっても横向きに設定する可能性がありますが、質問は、指定された方向をロックすることを指します。
greg7gkb 2013

3
私は、私が代わりにSCREEN_ORIENTATION_LOCKEDを使用景観にあった、それは私のために働いていた場合、私に、nosensorに設定すると、ポートレートモードに戻って私を取る
Jimmar

1
@JiMMaR SCREEN_ORIENTATION_LOCKEDは、18以上のAndroidに最適な方法です。しかし、それよりも低い何かを対象とする場合、それは機能しません。以下の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);
}

おかげで、問題なく動作していますが、なぜ||in rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_90とwithでチェックされるのか理解できませんでしたrotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_270。だから私は2つの疑問を持っています::::最初に、2番目のケースのROTATION_0代わりになぜROTATION_180そして180ではなく90で0度をチェックするのですか?
AndyBoy

@AndyBoyデバイスのデフォルトの向きに関係しています。通常、電話のデフォルトの向きは縦向きです。つまり、回転は縦向きに対してゼロを返しますが、一部のタブレットにはデフォルトの横向きがあります。つまり、回転は横向きに対してゼロを返します。したがって、さまざまな||チェックが、デバイスレポートの横向きと縦向きに基づいて、2つの可能なデフォルトの向きを処理しています。
jp36

5

これが私のコードです。これらのメソッドの1つで画面をロックし、タスクが完了したら、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.