Вопрос

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

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

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

Это было полезно?

Решение

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

Избегайте перезагрузки activity с помощью asynctask при изменении ориентации в Android

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

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

Смотрите ссылку на разработчика Изменения конфигурации для получения более подробной информации.

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

Обновить: Начиная с 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" в дополнение к "orientation" ценность.То есть вы должны объявить android:configChanges="orientation|screenSize".Однако, если ваше приложение нацелено на уровень API 12 или ниже, тогда ваша активность всегда обрабатывает это изменение конфигурации сама (это изменение конфигурации не перезапускает вашу активность, даже при запуске на устройстве Android 3.2 или более поздней версии).

Другие советы

Вам необходимо изменить AndroidManifest.xml как Сложности (ранее упоминалось Эштоном) и убедитесь, что действие обрабатывает событие 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" >

Или android: Ориентация экрана="пейзаж".

В вашем 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; для вас список пространств имен activity.

  1. Добавить:

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

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

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

Добавить

android:configChanges="keyboardHidden|orientation|screenSize" 

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

Пожалуйста, обратите внимание, что сейчас, похоже, ни один из методов не работает!

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top