настройка screenOrientation в AndroidManifest.xml не работает

У меня есть простой проект тестирования Android Hello World. В моем AndroidManifest.xml я уже установил

android:screenOrientation="portrait" 
android:configChanges="keyboardHidden|keyboard|orientation">

но когда я отлаживаю свой код, переменная isLandscape имеет значение True, когда она должна быть False

boolean isLandscape = getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE;

Я знаю, что я также могу установить ориентацию активности по коду, но по некоторым причинам мне нужно установить ее в xml. Как мне это сделать?

Изменить: мой AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.androidgames.mreater"
android:versionCode="1"
android:versionName="1.0" 
android:installLocation="preferExternal">

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="17" />

<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

<application
    android:icon="@drawable/ic_launcher"
    android:allowBackup="true"
    android:label="Mr. Eater" >
    <activity
        android:name="com.androidgames.mreater.MrEaterGame"
        android:label="Mr. Eater" 
        android:screenOrientation="portrait"
        android:configChanges="keyboard|keyboardHidden|orientation|screenSize">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

my actual onCreate activity method:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    boolean isLandscape = getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE;

    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN);

    int frameBufferWidth = isLandscape ? 480 : 320;
    int frameBufferHeight = isLandscape ? 320 : 480;
   Bitmap frameBuffer = Bitmap.createBitmap(frameBufferWidth,
            frameBufferHeight, Config.RGB_565);

    float scaleX = (float) frameBufferWidth
            / getWindowManager().getDefaultDisplay().getWidth();
    float scaleY = (float) frameBufferHeight
            / getWindowManager().getDefaultDisplay().getHeight();

    renderView = new AndroidFastRenderView(this, frameBuffer);
    graphics = new AndroidGraphics(getAssets(), frameBuffer);
    fileIO = new AndroidFileIO(getAssets());
    audio = new AndroidAudio(this);
    input = new AndroidInput(this, renderView, scaleX, scaleY);
    screen = this.getStartScreen();
   setContentView(renderView);

    PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
    wakeLock = powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK, "GLGame");
}

Теперь это становится более странным, переменная isLandscape имеет значение True, но иногда она имеет значение False. Это как-то похоже на баг.


person Cuồn Yết    schedule 26.06.2013    source источник
comment
На самом деле меняется ориентация экрана или просто переменная возвращает значение true?   -  person codeMagic    schedule 26.06.2013
comment
Вы устанавливаете его в теге активности, верно? Не помещать его в тег приложения? developer.android.com/guide/topics/manifest/   -  person Ken Wolf    schedule 26.06.2013
comment
Экран активности находится в альбомной ориентации, а не в портретной, как я хочу.   -  person Cuồn Yết    schedule 26.06.2013
comment
@KenWolf да. Я установил его в теге активности.   -  person Cuồn Yết    schedule 26.06.2013
comment
@CuồnYết странно. Я буквально только что попробовал это и не могу воспроизвести проблему. Эта проблема на всех устройствах/эмуляторах?   -  person Ken Wolf    schedule 26.06.2013
comment
Попробуйте удалить orientation из android:configChanges.   -  person W.K.S    schedule 26.06.2013
comment
@W.K.S спасибо, но это не работает.   -  person Cuồn Yết    schedule 26.06.2013
comment
@KenWolf Я пробовал это и в эмуляторе BlueStacks, и в устройстве, и теперь становится все более странно, что иногда переменная имеет значение True, а иногда False. это как-то похоже на баг.   -  person Cuồn Yết    schedule 27.06.2013


Ответы (2)


Убедитесь, что вы поместили его в тег <activity>, а не в тег <application>.

Он работает только в теге <activity>, но не будет жаловаться, если вы поместите его в тег <application>.

http://developer.android.com/guide/topics/manifest/application-element.html

vs

http://developer.android.com/guide/topics/manifest/activity-element.html

Вам нужно будет поместить его для каждого Activity, который вы определяете в своем manifest.xml.

person Ken Wolf    schedule 26.06.2013
comment
спасибо, Кен Вольф, но я поместил его в тег действия, а не в тег приложения. - person Cuồn Yết; 26.06.2013
comment
Я не знаю, что это тогда, все вроде хорошо из того, что вы описали. Может быть, отредактировать свой пост и добавить свой manifest.xml? Нам нужно больше подсказок :) - person Ken Wolf; 26.06.2013
comment
@CuồnYết, вы также должны объявить screeSize, если ваш заявленный целевой API 13 или выше. - person yugidroid; 26.06.2013
comment
Еще одна вещь, о которой я подумал (длинный план): убедитесь, что нет какой-либо другой ошибки, мешающей вам создавать, и что вы действительно тестируете последнюю версию своего приложения. Внесите небольшое изменение в строку или что-то еще и посмотрите, пройдет ли это. - person Ken Wolf; 26.06.2013

Вроде все хорошо, кроме одного! Я не знаю, ваш это случай или нет, но вы должны прочитать документация :D

Вам придется объявить screeSize, если ваши приложения нацелены на уровень API 13 или выше.

Если ваше приложение нацелено на уровень API 13 или выше (как указано в атрибутах minSdkVersion и targetSdkVersion), вам также следует объявить конфигурацию screenSize, поскольку она также меняется, когда устройство переключается между книжной и альбомной ориентацией.

Сообщите мне, что это решает вашу проблему.

person yugidroid    schedule 26.06.2013
comment
спасибо югидроид. Мои приложения нацелены на уровень API 17. Я добавил конфигурацию screenSize, но она не работает. активность все еще находится в ландшафте. - person Cuồn Yết; 26.06.2013