Как отключить изменение ориентации на Android?
У меня есть приложение, которое я хотел бы использовать в портретном режиме, так я определил
android: screenOrientation= "портрет" в XML-манифесте. Это работает нормально для HTC Magic телефон (и предотвращает изменения ориентации на других телефонах, а также).
но у меня проблема с HTC G1 телефон, как я открываю оборудование QWERTY-клавиатура (не виртуальной клавиатуры). Моя активность остается в портретном режиме, но, похоже, она перезапускается и теряет все свои состояния. Это не происходит с HTC Hero версия.
мое приложение довольно большое, поэтому я не хочу, чтобы оно перезапускалось и теряло все свои состояния при открытии клавиатуры. Как я могу это предотвратить?
12 ответов:
обновление апрель 2013: Не делайте этого. Это была не очень хорошая идея в 2009 году, когда я впервые ответил на вопрос, и это действительно не очень хорошая идея сейчас. См. этот ответ hackbod по причинам:
избегайте перезагрузки деятельности с asynctask на изменение ориентации в android
добавить
android:configChanges="keyboardHidden|orientation"к вашему AndroidManifest.XML. Это говорит системе, какие изменения конфигурации вы собираетесь обрабатывать самостоятельно - в этом случае, выполнив ничего.<activity android:name="MainActivity" android:screenOrientation="portrait" android:configChanges="keyboardHidden|orientation">см. справочник разработчика configChanges для более подробной информации.
тем не менее, ваше приложение может быть прервано в любое время, например, по телефону, так что вы действительно должны добавить код, чтобы сохранить состояние вашего приложения, когда он приостановлен.
обновление: начиная с Android 3.2, вам также нужно добавить "screenSize":
<activity android:name="MainActivity" android:screenOrientation="portrait" android:configChanges="keyboardHidden|orientation|screenSize">из руководства разработчика обработка изменения конфигурации Сам
внимание: начиная с Android 3.2 (уровень API 13), "Размер экрана " также изменяется при переключении устройства между книжной и альбомной ориентацией ориентация. Таким образом, если вы хотите предотвратить перезапуск среды выполнения из-за изменение ориентации при разработке для API уровня 13 или выше (как объявленные атрибутами minSdkVersion и targetSdkVersion), вы необходимо включить значение" screenSize "в дополнение к" ориентация" значение. То есть, вы должны заявлять
android:configChanges="orientation|screenSize". Однако, если ваш приложение нацелено на уровень API 12 или ниже, тогда ваша активность всегда обрабатывает это изменение конфигурации сам (это изменение конфигурации не перезапускает вашу деятельность, даже при работе на Android 3.2 или высшее устройство).
вам нужно изменить AndroidManifest.xml как Intrications (ранее Эштон) упоминалось и убедитесь, что действие обрабатывает событие onConfigurationChanged, как вы хотите его обрабатывать. Вот как это должно выглядеть:
@Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); }
Я всегда считал, что нужно как
android:screenOrientation="nosensor" android:configChanges="keyboardHidden|orientation"
как сказано, set
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, потому что ваше приложение перейдет в портретный режим, а затем обратно в ландшафтный (это произойдет только один раз, но это раздражает).также вы можете установить
android:screenOrientation="nosensor"для вашей деятельности (в манифесте). но используя таким образом, вы не в состоянии обрабатывать изменения ориентации вообще.
в методе 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" >или android: screenOrientation= "пейзаж".
в своем androidmanifest.xml file:
<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:
- добавить:
using Android.Content.PM;для вас список пространств имен действий.
- добавить:
[Activity(ScreenOrientation = Android.Content.PM.ScreenOrientation.Portrait)]как атрибут для вас класса, например:
[Activity(ScreenOrientation = ScreenOrientation.Portrait)] public class MainActivity : Activity {...}
обратите внимание, ни один из методов, кажется, не работает сейчас!
In Android Studio 1 один простой способ это добавить
android:screenOrientation="nosensor".это эффективно блокирует ориентацию экрана.
Comments