如何在不刷新 activity 的情况下使 android 横向布局工作?

How to make android landscape layout work without refreshing activity?

我已经看到有关删除 android:configChanges 以使横向布局正常工作的答案,但这会刷新 activity,我需要避免这种情况。一些答案建议以编程方式处理配置更改,但我不确定该怎么做。横向布局应该以编程方式创建吗?有人知道如何解决这个问题吗?

您可以使用 OrientationEventListener 监听方向变化,

这是一个 kotlin 示例代码,它将监听方向变化并检查它是横向还是纵向模式,

私有变量 mOrientationEventListener:OrientationEventListener? =空

私有阈值 = 30

私有变量 isLandScape = false

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    mOrientationEventListener = object : OrientationEventListener(context) {
        override fun onOrientationChanged(orientation: Int) {
            isLandScape = isLandscape(orientation)
        }
    }
    mOrientationEventListener!!.enable()
}

private fun isLandscape(orientation: Int): Boolean {
    return orientation >= 90 - THRESHOLD && orientation <= 90 + THRESHOLD || orientation >= 270 - THRESHOLD && orientation <= 270 + THRESHOLD
}

override fun onDestroy() {
    super.onDestroy()
    mOrientationEventListener!!.disable()
}

根据 landscape/portrait 模式,您可以通过 setRotation 属性 旋转视图。

正确答案是从清单中删除 android:configChanges,并正确处理正在重启的 activity。有一些技术可以解决您可能遇到的所有问题,除了旋转变化之外,还有许多其他因素可能导致它发生。

如果您绝对必须自己处理它,您可以通过覆盖 onConfigurationChanged 并检查是否是方向发生了变化来实现。但你不想那样做。如果您尝试自己做,那么您将拥有因自己不正确地做而导致的所有错误,并且由于您没有正确处理 activity 而未修复的所有错误都会重新启动。所以忘掉这个,从你的清单中删除 configChange,并修复它,这样你就可以处理重启。因为在您这样做之前,您的应用程序将变得一团糟,崩溃报告比您想象的要多。

你可以为此创建新的布局文件,与你的布局同名 并选择 Orientation in available qualifiers。 Android 管理一切。

如果您不想重新创建 activity,则必须使用带方向的 android:configchanges。您将必须在 onConfigurationChanged 方法中以编程方式处理布局。它可能很复杂,因为您不允许系统处理它。您将必须以编程方式设置对齐方式、参数和所有其他结构。您将获得现有纵向模式元素的参考,并且必须自己更改它们的位置和其他内容。