以编程方式将片段添加到约束布局中

时间:2020-05-25 16:36:02

标签: android user-interface kotlin

我正在尝试将两个片段添加到“约束布局”中,然后设置它们的约束,以确保较低的片段始终对齐到应用程序布局的底部,而较高的片段可以填充任何剩余的空间。我执行此操作的代码如下:

        val fragmentTransaction = fragmentManager.beginTransaction()
        fragmentTransaction.add(R.id.app_con_layout,fragmentA)
        fragmentTransaction.add(R.id.app_con_layout,fragmentB)
        fragmentTransaction.commit()

        val mConstraintLayout = findViewById<ConstraintLayout>(R.id.app_con_layout)
        val set = ConstraintSet()

        set.clone(mConstraintLayout)
        set.connect(fragmentA.id, ConstraintSet.TOP, R.id.app_toolbar, ConstraintSet.BOTTOM)
        set.connect(fragmentB.id, ConstraintSet.BOTTOM, mConstraintLayout.id, ConstraintSet.BOTTOM)
        set.applyTo(mConstraintLayout)

这不起作用,两个片段似乎彼此重叠。我的理解是片段不会获得唯一的ID,相反,我应该在片段事务中使用标签,以便以后可以唯一地引用片段。但这似乎与ConstraintSet的connect方法不兼容,后者需要一个整数id。

解决此问题的正确方法是什么?我可以在xml中的约束布局中添加框架布局,然后向其中添加片段,但这听起来像是一种解决方法,所以我怀疑我缺少了一些东西。

1 个答案:

答案 0 :(得分:1)

您为set.connect(…)使用了错误的ID。 Fragment具有View,如果要将其传递到connect(…),则需要该View ID。这对我来说太复杂了,因为您将需要等到Fragment生命周期开始(fragmentTransaction.commit()是异步的)。我不知道commitNow()是否可以为您提供帮助。

我可以在xml中的约束布局中添加框架布局

如果我是你,我会采用这种方法。这样,布局将保留在XML中,并且仅以编程方式将片段添加到其占位符(并处理其生命周期和事件传播)。