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

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

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

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

Ответ 1

Обновление Апрель 2013: Не делайте этого. Это было неплохо в 2009 году, когда я впервые ответил на этот вопрос, и сейчас это не очень хорошая идея. См. Этот ответ по hackbod по следующим причинам: fooobar.com/questions/11649/...

Добавьте 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 или более высокое устройство).

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

    android:screenOrientation="portrait"

Ответ 6

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

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

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

Ответ 7

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

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

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

Ответ 8

В файле androidmanifest.xml:

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

или

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

Ответ 9

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

Ответ 10

В Visual Studio Xamarin:

  • Добавить:

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

  1. Добавить:

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

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

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

Ответ 11

Добавить

android:configChanges="keyboardHidden|orientation|screenSize" 

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

Ответ 12

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

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

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