为所有活动设置固定方向

Set orientation fixed for all activities

我知道有两种方法可以通过编程方式将 Activity 的方向设置为横向

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

或在清单中:

android:orientation="landscape"

目前,我在超类中使用第一个,因为我有很多(子)活动,我都希望它们始终处于横向状态。然而,这使 onCreate 被调用两次,这会导致其他问题。在使用Manifest-route时,我必须将它分别应用于所有活动,这无疑会导致以后漏掉一个(更不用说所有代码复制了)。

有没有办法将 android:orientation="landscape" 应用到我应用中的所有活动?

在清单中,为您的所有活动设置此项:

<activity android:name=".YourActivity"
android:configChanges="orientation"
android:screenOrientation="portrait"/>

让我解释一下:

使用 android:configChanges="orientation" 你告诉 Android 你将负责方向的改变。 android:screenOrientation="portrait" 你设置默认方向模式。

OnCreate 将在创建 activity 时调用。当您在代码中设置

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

Activity 会重新创建自己,因此您无法真正阻止它。 (也许你可以,试一试,当你得到解决方案时尝试发布..)

你必须这样处理你的东西

可能的解决方案

android:configChanges="keyboardHidden|orientation|screenSize" in manifiest in tag

Add it directly in your manifest the orientation property

或者您可以尝试为所有活动制作 "superclass" 并从 "superclass" 扩展。

public abstract class SuperActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState);
      setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

我为应用程序中的所有活动设置了屏幕方向 class。

import android.app.Application
import android.os.Bundle
import android.app.Activity
import android.content.pm.ActivityInfo

class MyApplication : Application() {

    override fun onCreate() {
        super.onCreate()

        setListenerToCheckActivitySettings()
    }

    private fun setListenerToCheckActivitySettings() {

        registerActivityLifecycleCallbacks(object : ActivityLifecycleCallbacks {
            override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {

                activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
            }

            override fun onActivityStarted(activity: Activity) {}
            override fun onActivityResumed(activity: Activity) {}
            override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle?) {}
            override fun onActivityPaused(activity: Activity) {}
            override fun onActivityStopped(activity: Activity) {}
            override fun onActivityDestroyed(activity: Activity) {}
        })
    }
}