Как отключить изменение ориентации на Android?
У меня есть приложение, которое я просто хотел бы использовать в портретном режиме, поэтому я определил андроид: screenOrientation = «портрет» в манифесте XML. Это нормально работает для телефона HTC Magic (и предотвращает изменения ориентации на других телефонах).
Но у меня проблема с телефоном HTC G1, поскольку я открываю аппаратную клавиатуру QWERTY (а не виртуальную клавиатуру). Моя активность остается в портретном режиме, но, похоже, она перезапускается и теряет все свои состояния. Этого не происходит с версией HTC Hero .
Мое приложение довольно большое, поэтому я не хочу, чтобы он перезапускался и терял все свои состояния при открытии клавиатуры. Как я могу это предотвратить?
- Лучшая практика передачи контекста в classы без активности?
- Сделать новый вид активности за старым во время перехода
- Ошибки, управляющие жизненным циклом UnityPlayer в приложении для собственных приложений Android
- Android. Фрагмент getActivity () иногда возвращает null
- Активность kill / onCreate вызвана после съемки с помощью намерения
- ViewPager wrap_content не работает
- Android: захват возврата активности
- Передача данных не-примитивного типа между действиями в android
- Как выйти из приложения Android с помощью кода?
- Текст Android-центра на canvasе
- Завершить работу по истечении периода времени
- Заставка экрана при загрузке URL-адреса в веб-виде в приложении для Android
- android.content.ActivityNotFoundException:
Обновление Апрель 2013: Не делайте этого. Это было неплохо в 2009 году, когда я впервые ответил на этот вопрос, и сейчас это не очень хорошая идея. См. Этот ответ hackbod по причинам:
Избегайте перезагрузки с помощью asynctask при изменении ориентации в android
Добавьте android:configChanges="keyboardHidden|orientation"
в ваш AndroidManifest.xml. Это сообщает системе, какие изменения конфигурации вы собираетесь обрабатывать самостоятельно – в этом случае ничего не делая.
Дополнительную информацию см. В разделе « Конфигурация разработчика».
Тем не менее, ваше приложение может быть прервано в любое время, например, по телефону, поэтому вы действительно должны добавить код, чтобы сохранить состояние своего приложения, когда оно приостановлено.
Обновление: с Android 3.2 вам также нужно добавить «screenSize»:
Из руководства разработчика Обработка конфигурации измените себя
Внимание: Начиная с 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
, потому что ваше приложение переключится в портретный режим, а затем вернется к пейзажу (это произойдет только один раз, но это раздражает).
Также вы можете установить 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 :
или
@Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); }
Чтобы заблокировать экран по коду, вы должны использовать фактическое rotation экрана (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 {...}
Добавить
android:configChanges="keyboardHidden|orientation|screenSize"
вашему манифесту.
Обратите внимание, что ни один из методов не работает сейчас!
В Android Studio 1 один простой способ – добавить android:screenOrientation="nosensor"
.
Это эффективно блокирует ориентацию экрана.