Ориентация не работает в 2.3.3?

Я подготовил одно приложение. Мое приложение будет поддерживать как альбомную, так и портретную ориентацию. Когда я меняю ориентацию с портрета на пейзаж, он работает нормально, но когда я меняю пейзаж на портрет, он не работает. Мой код:

  public void onConfigurationChanged(Configuration newConfig) {

        super.onConfigurationChanged(newConfig);
        System.out.println("orientation---"+getResources().getConfiguration().orientation);
        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
            setContentView(R.layout.main);
            System.out.println("landscape-----");
        } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
            setContentView(R.layout.main);
            System.out.println("portrait-----");
        }

    }

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

System.out.println("orientation---"+getResources().getConfiguration().orientation);

Выше SOP печатает 2 означает пейзаж. Пожалуйста, помогите мне.(Я использую 2.3.3)

3 ответа

Решение

Возможно, вы столкнулись с этой ошибкой "Ориентация не меняется с альбомной на портретную на Эмуляторе на 2.3"

Более 45 человек сталкиваются с той же проблемой с эмулятором Android 2.3

http://code.google.com/p/android/issues/detail?id=13189

ОС хоста: Windows 7 SDK tools версия: редакция 8 Версия Eclipse: 3.5 Версия плагина ADT: 8.0.1 Платформа, на которую ориентирован ваш проект: 2.3 Версия платформы, работающей в эмуляторе: 2.3

ШАГИ ДЛЯ ВОСПРОИЗВЕДЕНИЯ: 1. Задание 1 (без ориентации экрана) - Задание 2 (ориентация экрана = ландшафт)

  1. Переход от действия 1 к 2 работает нормально. Нажатие назад меняет ориентацию упражнения 1 на ландшафт

ОЖИДАЕМЫЕ РЕЗУЛЬТАТЫ: Упражнение 1 должно быть в портретном режиме

НАБЛЮДЕННЫЕ РЕЗУЛЬТАТЫ: Поведение наблюдается только в пряниках, работает, как и ожидалось, на froyo.

Проблема с android:configChanges="orientation|keyboardHidden",

если вы удалите |keyboardHidden из файла androidmanifest.xml onConfigurationChanged запускается только при повороте из альбомной ориентации в портретную, а не при переходе из портретной в альбомную (по крайней мере, в эмуляторе по умолчанию).

Надеюсь это поможет.

РЕДАКТИРОВАТЬ: ДЕЙСТВИТЕЛЬНО какой-то образец программы, чтобы проверить его и отлично работает для меня

CheckOrientationActivity.java

import android.content.res.Configuration;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;

public class CheckOrientationActivity extends Activity {


    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second_layout);
        Log.i("DayElevenActivity", "onCreate Start");
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        Log.i("DayElevenActivity", "onConfigurationChanged");
        // Checks the orientation of the screen
        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
            Log.i("ORIENTATION_LANDSCAPE", "ORIENTATION_LANDSCAPE");
            Toast.makeText(getBaseContext(), "ORIENTATION_LANDSCAPE", Toast.LENGTH_SHORT).show();
        } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
            Log.i("ORIENTATION_PORTRAIT", "ORIENTATION_PORTRAIT");
            Toast.makeText(getBaseContext(), "ORIENTATION_PORTRAIT", Toast.LENGTH_SHORT).show();
        }
    }

}

В AndroidManifest.xml

<activity
            android:label="@string/app_name"   
            android:configChanges="**orientation|keyboardHidden**"    
            android:name=".CheckOrientationActivity" >
            <intent-filter >
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

Соответствующие журналы, когда я бегу и меняю ориентацию

03-05 18:54:31.644: I/CheckOrientationActivity (20314): onCreate Start
03-05 18:54:35.014: I/CheckOrientationActivity (20314): onConfigurationChanged
03-05 18:54:35.014: I/ORIENTATION_LANDSCAPE(20314): ORIENTATION_LANDSCAPE
03-05 18:54:41.984: I/CheckOrientationActivity (20314): onConfigurationChanged
03-05 18:54:41.984: I/ORIENTATION_PORTRAIT(20314): ORIENTATION_PORTRAIT

Существует множество причин, по которым это может произойти, трудно сказать, не увидев больше кода.

Вот несколько указателей:

  • Вы не заставили макет к определенной ориентации через файл манифеста или программно (что-то вроде <activity android:screenOrientation="portrait"> в вашем манифесте)

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

    Android:configChanges="ориентация"

на конфигурации вашей деятельности в манифесте.

  • вышеупомянутый пункт фактически заставит Android называть вашу деятельность onConfigurationChanged(Configuration) метод, когда ориентация меняется

== Обновление ==

Кроме того, если у вас одинаковый макет (например, "основной"), объявленный в layout-land и layout-port, вам нужно только указать, что вы хотите использовать этот макет в начале:

 public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }

и это все. НЕ НУЖНО также реализовывать

public void onConfigurationChanged(Configuration newConfig) {
  //...
}

метод также. Для того, чтобы выбрать правильный макет на основе ориентации, все, что вам нужно сделать, это объявить один и тот же макет в этих двух папках.

(Кроме того, нет необходимости добавлять android:configChanges="orientation" к вашему манифесту, видимо он включен по умолчанию). Я попробовал все это только сейчас, работает нормально

Другие вопросы по тегам