繁体   English   中英

如何在没有刷新活动的情况下使 android 横向布局工作?

[英]How to make android landscape layout work without refreshing activity?

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

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

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

您可以为此创建新的布局文件,使用与您的布局相同的名称,并在可用的限定符中选择方向。 Android 管理一切。

在此处输入图像描述

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

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

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

私有变量 mOrientationEventListener:OrientationEventListener? = null

私有值 THRESHOLD = 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()
}

根据横向/纵向模式,您可以通过 setRotation 属性旋转视图。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM