为什么 `android:screenOrientation="behind"` 在 android 4.1.2 中没有效果?

问题描述 投票:0回答:2

作为测试示例,有一个具有 2 个活动的应用程序:

MainActivity
,单击按钮时启动
SecondActivity

它在 Android 4.0.4 上运行良好,但在 Android 4.1.2 上我遇到了意外的行为。

系统设置中的自动旋转已关闭(或打开 - 没关系,“后面”选项无论如何都会被忽略)。

android:screenOrientation="landscape"
设置为
MainActivity
android:screenOrientation="behind"
设置为
SecondActivity
,这意味着
SecondActivity
也必须以横向启动。
对于 Android 4.0.4 来说是这样,但在 Android 4.1.2 上
SecondActivity
从纵向开始。

AndroidManifest.xml:

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

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name="com.my.example.testbehindorientation.MainActivity"
        android:label="@string/app_name"
        android:screenOrientation="landscape" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name="com.my.example.testbehindorientation.SecondActivity"
        android:configChanges="screenSize|orientation"
        android:label="@string/title_activity_second"
        android:screenOrientation="behind" >
    </activity>
</application>

SecondActivity.java:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_second);
    logOrientation("onCreate");
}


@Override
protected void onDestroy() {
    super.onDestroy();
    logOrientation("onDestroy");
}

@Override
protected void onResume() {
    super.onResume();
    logOrientation("onResume");
}

private void logOrientation(String prefix) {
        int requestedOrientation = this.getRequestedOrientation();
        WindowManager lWindowManager =  (WindowManager) getSystemService(WINDOW_SERVICE);
        Configuration cfg = getResources().getConfiguration();
        int lRotation = lWindowManager.getDefaultDisplay().getRotation();   
        int orientation = cfg.orientation;
        Log.i(LOG_TAG, prefix + ", requestedOrientation is " + requestedOrientation + ", rotation is " + lRotation + ", orientation is " + orientation);
}

android:configChanges="screenSize|orientation"
中单击按钮后,
AndroidManifest.xml
中没有
SecondActivity
行的日志输出:

MainActivity

使用 
onCreate, requestedOrientation is 3, rotation is 1, orientation is 2 onResume, requestedOrientation is 3, rotation is 1, orientation is 2 onDestroy, requestedOrientation is 3, rotation is 0, orientation is 1 onCreate, requestedOrientation is 3, rotation is 0, orientation is 1 onResume, requestedOrientation is 3, rotation is 0, orientation is 1

行记录在

android:configChanges="screenSize|orientation"
中:

AndroidManifest.xml

现在没有活动娱乐,但结果总是一样的 - 
onCreate, requestedOrientation is 3, rotation is 1, orientation is 2 onResume, requestedOrientation is 3, rotation is 1, orientation is 2

是从纵向开始! :( 也就是说,由于某种原因,

SecondActivity
在onResume之后旋转为纵向。 为什么?.

测试于:

配备 Android 4.0.4 的三星 Galaxy S3(好的)
  • 搭载 Android 4.1 的三星 Galaxy S3。? (错误)
  • Android 4.1.2 模拟器,具有纵向主屏幕方向(Bug)
  • Android 4.0.3模拟器(好的)
  • Android 4.2模拟器(Bug)
android android-activity orientation screen-orientation android-orientation
2个回答
0
投票
SecondActivity


在清单文件中删除此语句,因为 SDKVersion=16 仅适用于 v4.0。


0
投票


Manifest.xml
android:targetSdkVersion="16"

第二个景观活动

<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="16" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.my.example.testbehindorientation.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name="com.my.example.testbehindorientation.SecondActivity" android:configChanges="screenSize|orientation" android:label="@string/title_activity_second" > </activity> </application>

在MainActivity的

onCreate()方法中添加以下代码 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//Change according to need this is for landscape logOrientation("onCreate"); } @Override protected void onDestroy() { super.onDestroy(); logOrientation("onDestroy"); } @Override protected void onResume() { super.onResume(); logOrientation("onResume"); } private void logOrientation(String prefix) { int requestedOrientation = this.getRequestedOrientation(); WindowManager lWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE); Configuration cfg = getResources().getConfiguration(); int lRotation = lWindowManager.getDefaultDisplay().getRotation(); int orientation = cfg.orientation; Log.i(LOG_TAG, prefix + ", requestedOrientation is " + requestedOrientation + ", rotation is " + lRotation + ", orientation is " + orientation); }

© www.soinside.com 2019 - 2024. All rights reserved.