在方向更改时调整 ConstraintLayout

Posted

技术标签:

【中文标题】在方向更改时调整 ConstraintLayout【英文标题】:Resize ConstraintLayout on orientation change 【发布时间】:2018-06-08 17:09:52 【问题描述】:

我正在 ConstraintLayout 的布局内播放视频,并覆盖 onConfigurationChanged 而不是重新启动活动,以防止视频在方向更改时停止和启动。我正在尝试确定将布局调整为全屏的最佳方式,因为布局在旋转期间不会刷新。布局使用以下约束:

app:layout_constraintEnd_toEndOf="parent"  
app:layout_constraintStart_toStartOf="parent"  
android:layout_  
android:layout_  

旋转后,我希望布局使用相同的约束,但宽度和高度会发生变化以适应横向而不是纵向,反之亦然。我目前使用DisplayMetrics 将视频播放器布局设置为屏幕的宽度和高度,但想知道是否有更好的解决方案。 RequestLayout 似乎没有这样做。谁有更好的解决方案?

【问题讨论】:

您需要创建两个布局,一个用于纵向模式,另一个用于横向模式,您可以根据需要自行配置它们,这比在 java 代码中使用函数更好。另见***.com/questions/4858026/… 谢谢 Azhy,我已经为一些过渡做了这个,但这是一个大布局,我有点想寻找一个解决方案,如果可能的话,我每次都不需要维护多个布局对其进行更改。虽然很好的解决方案。这可能是唯一的选择。只是想知道是否有任何“刷新”可以查看新的屏幕边界并进行调整。谢谢 我认为这是最成功的方法。 所以解决办法是创建两个不同的文件? 是的,包含很多内容以减少对 2 个布局的维护。 【参考方案1】:

使用 onConfigurationChanged 方法并在同一布局上为 constrain set 设置动画...

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        Context context = this;
        mConstraintSet2.clone(context, R.layout.state2); // get constraints from layout
        setContentView(R.layout.state1);
        mConstraintLayout = (ConstraintLayout) findViewById(R.id.activity_main);
        mConstraintSet1.clone(mConstraintLayout); // get constraints from ConstraintSet
    

    override fun onConfigurationChanged(newConfig: Configuration) 
        super.onConfigurationChanged(newConfig)
    
        // Checks the orientation of the screen
        if (newConfig.orientation === Configuration.ORIENTATION_LANDSCAPE) 
            Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show()
            TransitionManager.beginDelayedTransition(mConstraintLayout);
            mConstraintSet1.applyTo(mConstraintLayout); // set new constraints
         else if (newConfig.orientation === Configuration.ORIENTATION_PORTRAIT) 
            Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show()
            TransitionManager.beginDelayedTransition(mConstraintLayout);
            mConstraintSet2.applyTo(mConstraintLayout); // set new constraints
        
    

【讨论】:

以上是关于在方向更改时调整 ConstraintLayout的主要内容,如果未能解决你的问题,请参考以下文章

如何在方向更改时调整多个标签的大小以自动适应 UIView 内部

嵌套集合视图单元格未在方向更改时调整大小

Twitter Bootstrap:导航栏未在方向更改时调整大小(仅适用于 Android 的股票浏览器)

避免在方向改变时调整字体大小

UIKeyBoard 在方向更改为横向时调整大小

界面方向改变时调整图层大小?