Как отключить изменение ориентации на Android?

У меня есть приложение, которое я просто хотел бы использовать в портретном режиме, поэтому я определил андроид: screenOrientation = «портрет» в манифесте XML. Это нормально работает для телефона HTC Magic (а также предотвращает изменения ориентации на других телефонах).

Но у меня проблема с телефоном HTC G1, поскольку я открываю аппаратную клавиатуру QWERTY (а не виртуальную клавиатуру). Моя деятельность остается в портретном режиме, но, похоже, она перезапускается и теряет все свои состояния. Этого не происходит с версией HTC Hero .

Мое приложение довольно большое, поэтому я не хочу, чтобы он перезапускался и терял все его состояния при открытии клавиатуры. Как я могу это предотвратить?

Solutions Collecting From Web of "Как отключить изменение ориентации на Android?"

Обновление Апрель 2013: Не делайте этого. Это было неплохо в 2009 году, когда я впервые ответил на этот вопрос, и сейчас это не очень хорошая идея. См. Этот ответ по hackbod по причинам: https://stackoverflow.com/a/5336057/84021

Добавьте android:configChanges="keyboardHidden|orientation" в ваш AndroidManifest.xml. Это сообщает системе, какие изменения конфигурации вы собираетесь обрабатывать самостоятельно – в этом случае ничего не делая.

 <activity android:name="MainActivity" android:screenOrientation="portrait" android:configChanges="keyboardHidden|orientation"> 

Подробнее см. http://developer.android.com/reference/android/R.attr.html#configChanges .

Однако ваше приложение может быть прервано в любое время, например, по телефону, поэтому вы действительно должны добавить код, чтобы сохранить состояние своего приложения, когда оно приостановлено.

Обновление: с Android 3.2 вам также нужно добавить «screenSize»:

 <activity android:name="MainActivity" android:screenOrientation="portrait" android:configChanges="keyboardHidden|orientation|screenSize"> 

Из http://developer.android.com/guide/topics/resources/runtime-changes.html#HandlingTheChange :

Внимание: начиная с Android 3.2 (уровень API 13), размер экрана также изменяется, когда устройство переключается между портретной и альбомной ориентацией. Таким образом, если вы хотите предотвратить перезагрузку во время изменения ориентации при разработке для уровня API 13 или выше (как объявлено атрибутами minSdkVersion и targetSdkVersion), вы должны включить значение «screenSize» в дополнение к значению «ориентация». То есть вы должны объявить android:configChanges="orientation|screenSize" . Однако, если ваше приложение нацелено на уровень API 12 или ниже, ваша деятельность всегда обрабатывает это изменение самой конфигурации (это изменение конфигурации не перезапускает вашу активность даже при работе на устройстве Android 3.2 или выше).

Вам нужно изменить AndroidManifest.xml как Intrications (ранее Ashton) и убедиться, что активность обрабатывает событие onConfigurationChanged, как вы хотите, чтобы оно обрабатывалось. Вот как это должно выглядеть:

 @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); } 

Я всегда находил, что вам нужны оба

 android:screenOrientation="nosensor" android:configChanges="keyboardHidden|orientation" 

Как сказано, установите android:configChanges вашей активности (в файле манифеста) на keyboardHidden|orientation а затем:

1) Переопределить onConfigurationChanged()

 @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); //here you can handle orientation change } 

2) Добавьте эту строку в свою активность onCreate()

 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 

Лучше, чем добавить onConfigurationChanged же строку в onConfigurationChanged , потому что ваше приложение переключится в портретный режим, а затем обратно в альбомное (это произойдет только один раз, но это раздражает).

Также вы можете установить android:screenOrientation="nosensor" для вашей активности (в манифесте). Но, используя этот способ, вы не в состоянии справиться с изменениями ориентации вообще.

Использовать это..

  android:screenOrientation="portrait" 

В методе OnCreate вашей деятельности используйте этот код:

  @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 

Теперь ваша ориентация будет установлена ​​на портрет и никогда не изменится.

В файле AndroidManifest.xml для каждого действия, которое вы хотите заблокировать, добавьте последнюю строку screenOrientation :

 android:label="@string/app_name" android:name=".Login" android:screenOrientation="portrait" > 

Или андроид: screenOrientation = "пейзаж" .

В файле androidmanifest.xml :

  <activity android:name="MainActivity" android:configChanges="keyboardHidden|orientation"> 

или

 @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); } 

Чтобы заблокировать экран по коду, вы должны использовать фактическое вращение экрана (0, 90, 180, 270), и вы должны знать его естественное положение, в смартфоне естественным положением будет портрет и планшет, Это будет пейзаж.

Вот код (методы блокировки и разблокировки), он был протестирован на некоторых устройствах (смартфонах и планшетах), и он отлично работает.

 public static void lockScreenOrientation(Activity activity) { WindowManager windowManager = (WindowManager) activity.getSystemService(Context.WINDOW_SERVICE); Configuration configuration = activity.getResources().getConfiguration(); int rotation = windowManager.getDefaultDisplay().getRotation(); // Search for the natural position of the device if(configuration.orientation == Configuration.ORIENTATION_LANDSCAPE && (rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_180) || configuration.orientation == Configuration.ORIENTATION_PORTRAIT && (rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270)) { // Natural position is Landscape switch (rotation) { case Surface.ROTATION_0: activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); break; case Surface.ROTATION_90: activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT); break; case Surface.ROTATION_180: activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE); break; case Surface.ROTATION_270: activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); break; } } else { // Natural position is Portrait switch (rotation) { case Surface.ROTATION_0: activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); break; case Surface.ROTATION_90: activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); break; case Surface.ROTATION_180: activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT); break; case Surface.ROTATION_270: activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE); break; } } } public static void unlockScreenOrientation(Activity activity) { activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); } 

В Visual Studio Xamarin:

  1. Добавить:

using Android.Content.PM; Для вашего списка имен объектов.

  1. Добавить:

[Activity(ScreenOrientation = Android.Content.PM.ScreenOrientation.Portrait)]

Как атрибут для вас, например:

 [Activity(ScreenOrientation = ScreenOrientation.Portrait)] public class MainActivity : Activity {...} 

Добавить

 android:configChanges="keyboardHidden|orientation|screenSize" 

К вашему манифесту.

Обратите внимание: теперь ни один из методов не работает!

В Android Studio 1 один простой способ – добавить android:screenOrientation="nosensor" .

Это эффективно блокирует ориентацию экрана.