安卓系统上的活动方向会自动更改

我正在开发一个基于Android的移动应用程序。我想支持平板电脑的两种方向,也只支持智能手机的纵向。一切都像一个魅力,但我正在经历一个小错误,让我发疯。当智能手机处于横向模式时,我尝试触发新的活动,它会在横向模式下打开一段时间,然后自动旋转到纵向。我的每个活动都扩展了一个 GeneralActivity 类:minSdkVersion=15

public class GeneralActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // If smartphone lock orientation to portrait
        if (!Helper.isTablet(this.getApplicationContext())){
            this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        }
    }
}

我使用此功能检测平板电脑:

public class Helper {
    public static boolean isTablet(Context context){
        Configuration config = context.getResources().getConfiguration()
        return config.smallestScreenWidthDp >= 600;
    }
}

我选择不在 Manifest 中指定.xml因为通过这种方式,我能够支持平板电脑的所有界面方向。我错过了什么吗?android:screenOrientation

编辑

我决定应用Jonathan在答案中建议的最佳实践,但我描述的问题仍然存在。这是我在github上的存储库:https://github.com/giacmarangoni/Android-Orientation-Test


答案 1

我在Android N&O上遇到了同样的问题,并找到了解决方案。

我仍然在 onCreate 方法中使用 setRequestEdOrientation,但我已经为清单中的每个活动添加了这个:

android:screenOrientation="behind"

这可确保活动以与上一个活动相同的方向启动。之后的 setRequestEdOrientation 将覆盖它,但如果它与上一个活动相同,则不会看到用户身份的任何更改。


答案 2

我找到了解决此问题的正确方法,方法是使用:

android:screenOrientation="locked"

在清单中声明的每个活动中,并出现此问题。

并继续使用程序化来定义onCreate()方法中的横向或纵向方向,setRequestedOrientation()

顺便说一句,在您的GitHub项目中,我刚刚更改了清单添加方向,如下所示,它最终起作用了:locked

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.giacomomarangoni.orientationtest">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity"
            android:screenOrientation="locked">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".OtherActivity"
            android:screenOrientation="locked">
        </activity>
    </application>
</manifest>

希望它能帮助你太:)


推荐