Как отключить изменение ориентации на Android? - PullRequest
278 голосов
/ 03 октября 2009

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

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

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

Ответы [ 12 ]

310 голосов
/ 03 октября 2009

Обновление апрель 2013: не делайте этого. Это не было хорошей идеей в 2009 году, когда я впервые ответил на вопрос, и сейчас это действительно не очень хорошая идея. Смотрите этот ответ по hackbod по причинам:

Избегайте перезагрузки активности с асинхронной задачей при изменении ориентации в 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 или вышестоящее устройство).

94 голосов
/ 05 марта 2011

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

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
39 голосов
/ 09 июля 2011

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

android:screenOrientation="nosensor" android:configChanges="keyboardHidden|orientation"
22 голосов
/ 15 января 2012

Как уже было сказано, установите 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" для вашей активности (в манифесте). Но , используя этот способ, вы вообще не сможете обрабатывать изменения ориентации.

20 голосов
/ 03 апреля 2013

Используйте это ..

    android:screenOrientation="portrait"
13 голосов
/ 07 сентября 2012

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

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

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

10 голосов
/ 30 июля 2013

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

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

Или android: screenOrientation = "landscape" .

8 голосов
/ 24 ноября 2011

В вашем файле androidmanifest.xml :

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

или

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
5 голосов
/ 16 мая 2013

Чтобы заблокировать экран по коду, вы должны использовать фактическое вращение экрана (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);
}
2 голосов
/ 14 ноября 2016

В Visual Studio Xamarin:

  1. Добавить:

using Android.Content.PM; список пространств имен для вашей деятельности.

  1. Добавить:

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

как атрибут вашего класса, например:

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