2013-11-26 13 views
6

私は次のコードを持っています。方向ロックはアンドロイドでプログラム的に

のJava

public void lockScreenOrientation() { 
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR); 
} 

public void unlockScreenOrientation() { 
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR); 
} 

私はJavaScriptからこれらの関数を呼び出しています。コントロールはこれらのメソッドに入ります。しかし、向きはロックされていません。

私はこれらの向き

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR); 
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE); 

どれも動作するようには思えないロックするには、以下の試してみました。任意のポインタが役立つだろう。

+0

'setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);を試しましたか? 'と' setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); '? –

+0

どの方向モードが必要ですか? – GrIsHu

+0

向きを固定したい。風景の場合は風景に固定し、縦の場合は肖像画に固定したいと思っています。両方とも動作していません。だから私はテスト目的のために横長の向きにロックしようとしています。 – user2682527

答えて

5

オリエンテーションロックに対処するためのユーティリティメソッドをいくつか作成しました。このクラスを自由に使用してください。

使用例:フラグメントでOrientationUtils.lockOrientationPortrait(MyActivityName.this)

  • :活動の

    • OrientationUtils.lockOrientationLandscape(getActivity())

    コード:

    /** 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); 
        } 
    
        /** Allows user to freely use portrait or landscape mode. */ 
        public static void unlockOrientation(Activity activity) { 
         activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); 
        } 
    
    } 
    

    ここに私の完全なOrientationUtilsクラスはGitHubの上にあることができますどのAndroidアプリでも使用できます:https://github.com/danialgoodwin/android-simply-advanced-helper/blob/master/SimplyAdvancedHelperLibrary/src/net/simplyadvanced/utils/OrientationUtils.java

  • 1

    これは、画面の向きのロックとロック解除を処理するために書いたクラスです。私は、トグルボタンのcheckedChangedListenerからtoggleScreenOrientationLock(this, prefs, isChecked)を呼び出し、onCreate()からrestoreScreenLock(this, prefs)を呼び出します。いずれの場合も、thisがあなたの活動であり、prefsSharedPrefencesオブジェクトであり、ロックの状態に関する情報を保存するために使用されます。

    コードの複雑な部分は、getScreenOrientation()機能、which I stole from and cleaned up from hereです。私はこの仕組みの背後にある論理を説明しようとします。

    デバイスの向きをsetRequestedOrienation()に設定すると、デバイスが横向きまたは縦向きのモードかどうかを知る必要があり、逆向き(180度回転)かどうかを知る必要があります。

    getResources().getConfiguration().orientationを使用すると、私たちがどの向きにいるのかという質問に答えることができます。デバイスの回転を考慮することができれば、それが180度回転したかどうかを知ることができます。残念ながら、デバイスによっては、ROTATE_0がポートレートまたはランドスケープである可能性があります。携帯電話は通常、ROTATE_0をポートレートに、タブレットをランドスケープにマッピングします。

    ここで使用されているソリューションは、スクリーンの寸法を使用して、横または縦になっているかどうかを判断することです。画面の幅が画面の幅より広い場合は、デバイスが横向きであることが推測され、縦向きの場合は逆も同様です。次に、向きを逆転させるかどうかを判断するために、回転を考慮に入れることができます。

    たとえば、画面の高さが画面の幅より広い場合は、横向きになっていることがわかります。ローテーションが0または180の場合(コードのロジックでは!isRotatedOrthogonallyに等しい)、0がLANDSCAPE、180がREVERSE_LANDSCAPEであることがわかります。

    It has been noted elsewhereこれは、90または270のどちらかが逆向きであるかどうかはデバイス固有であるため、すべてのデバイスで機能しないことを意味します。しかしこれはおそらくあなたがやるべき最高のものです。最悪の場合、1つの向きが180度回転します。これは、画面を他の方法でロックしようとすると起こりそうなことです。

    public class ScreenLocker { 
        final private static String ROTATION_LOCKED_KEY = "LockedOrientationVal"; 
        final private static String ROTATION_IS_LOCKED_KEY = "IsRotationLocked"; 
        final private static String ROTATION_SAVED_KEY = "SavedOrientationVal"; 
    
        public static int getScreenOrientation(Activity activity) { 
         final Display display = activity.getWindowManager().getDefaultDisplay(); 
         final int rotation = display.getRotation(); 
    
         Point size = new Point(); 
         display.getSize(size); 
    
         final boolean isWiderThanTall = size.x > size.y; 
    
         final boolean isRotatedOrthogonally = (rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270); 
         int orientation; 
    
         if (isRotatedOrthogonally) { 
          if (isWiderThanTall) 
           orientation = (rotation == Surface.ROTATION_90) ? ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE : ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE; 
          else 
           orientation = (rotation == Surface.ROTATION_90) ? ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT : ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; // normal and reversed switched intended 
         } 
         else { 
          if (isWiderThanTall) 
           orientation = (rotation == Surface.ROTATION_0) ? ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE : ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE; 
          else 
           orientation = (rotation == Surface.ROTATION_0) ? ActivityInfo.SCREEN_ORIENTATION_PORTRAIT : ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT; 
         } 
    
         return orientation; 
        } 
    
        public static void toggleScreenOrientationLock(Activity activity,SharedPreferences prefs, boolean lock) { 
         if(lock) 
          lockScreenOrientation(activity, prefs); 
         else 
          unlockScreenOrientation(activity, prefs); 
        } 
    
    
        // call this from your activity's onCreate() or onResume() 
        public static boolean restoreScreenLock(Activity activity, SharedPreferences prefs) { 
         final boolean isLocked = prefs.getBoolean(ROTATION_IS_LOCKED_KEY, false); 
         final int previousLockedOrientation = prefs.getInt(ROTATION_LOCKED_KEY, -999); 
    
         if(isLocked && previousLockedOrientation != -999) { 
          prefs.edit().putInt(ROTATION_SAVED_KEY, activity.getRequestedOrientation()).apply(); 
          activity.setRequestedOrientation(previousLockedOrientation); 
          return true; 
         } 
         return false; 
        } 
    
        private static void lockScreenOrientation(Activity activity, SharedPreferences prefs) { 
         final int currentOrientation = activity.getRequestedOrientation(); 
         final int lockOrientation = getScreenOrientation(activity); 
    
         // checking isCurrentlyLocked prevents the ROTATION_LOCKED_KEY and ROTATION_SAVED_KEY 
         // becoming identical, which results in the screen not being able to be unlocked. 
         final boolean isCurrentlyLocked = prefs.getBoolean(ROTATION_IS_LOCKED_KEY, false); 
    
         if(!isCurrentlyLocked) { 
          activity.setRequestedOrientation(lockOrientation); 
          prefs.edit() 
            .putInt(ROTATION_SAVED_KEY, currentOrientation) 
            .putInt(ROTATION_LOCKED_KEY, lockOrientation) 
            .putBoolean(ROTATION_IS_LOCKED_KEY, true) 
            .apply(); 
         } 
        } 
    
        private static void unlockScreenOrientation(Activity activity, SharedPreferences prefs) { 
         final int savedOrientation = prefs.getInt(ROTATION_SAVED_KEY, activity.getRequestedOrientation()); 
         activity.setRequestedOrientation(savedOrientation); 
         prefs.edit().putBoolean(ROTATION_IS_LOCKED_KEY, false).apply(); 
        } 
    } 
    
    4
    Activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED); 
    


    だったどの向きで画面(活性)をロックします。

    APIレベル> = 18が必要です。

    0

    これは、私にとってうまくいく別の簡単な解決策です。

    private void orientationManager(boolean lock) 
    { 
        int currentOrientation = getResources().getConfiguration().orientation; 
        if(lock) 
        { 
         if (currentOrientation == Configuration.ORIENTATION_LANDSCAPE) 
         { 
          setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE); 
         } 
         else 
         { 
          setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT); 
         } 
        } 
        else 
        { 
         setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); 
        } 
    } 
    

    私は、ダイアログを閉じたときのダイアログが開くとorientationManager(false);のロックを解除したorientationManager(true);現在の画面の向きをロックする必要がありました。

    関連する問題