Ориентация не работает в 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 к 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"
к вашему манифесту, видимо он включен по умолчанию). Я попробовал все это только сейчас, работает нормально