Как заблокировать ориентацию во время выполнения

Есть ли способ заблокировать ориентацию во время выполнения? Например, я хотел бы разрешить пользователю блокировать экран в альбомной ориентации, если пользователь в настоящее время находится в ландшафтном режиме и переключает параметр меню.

Solutions Collecting From Web of "Как заблокировать ориентацию во время выполнения"

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 

Призывается о деятельности, будет блокировать его пейзаж. Ищите другие флаги в классе ActivityInfo. Вы можете заблокировать его до портрета или сделать его датчиком / слайдером.

Подробнее здесь: http://www.devx.com/wireless/Article/40792

Будьте осторожны с различием между тем, что возвращает 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); } 

Это работает на устройствах с обратным портретом и обратным пейзажем.

Ориентация фиксации:

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

У меня, похоже, был похожий случай. Я хотел поддержать любую ориентацию, но мне нужно было оставаться в текущей ориентации после определенного момента в рабочем процессе. Мое решение было:

При входе защищенного рабочего процесса:

 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR); 

При выходе защищенного рабочего процесса:

 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); 

Альтернатива @pstoppani отвечает с поддержкой планшета (как и с ответом @pstoppani, это будет работать только на устройствах> 2.2)
-Tested на Samsung Galaxy SIII и Samsung 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); } 

Вот мой код, вы можете заблокировать одним из этих методов на своем экране и как только закончите задачу, разблокируйте его с помощью 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); } } 

Вот преобразование Xamarin ответа @pstoppani выше.

ПРИМЕЧАНИЕ. Это для фрагмента, замените Activity. С этим. Если они используются в рамках действия.

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

Это непроверено, поскольку он использовался с другим подходом до его использования, но может быть полезен.