使用嵌套约束布局的多视图点击事件(2.0.0 beta 2)

时间:2019-07-18 10:58:31

标签: android performance kotlin android-constraintlayout android-motionlayout

我已经使用ConstraintLayout创建了布局,并且ConstraintLayout允许您构建复杂的布局而不必嵌套View。就我而言,我想要多个视图点击事件。

我尝试使用Group,因为您可以在代码中获取属于Group成员的ID列表,并设置点击监听器。

 fun Group.setAllOnClickListener(listener: View.OnClickListener?) {
            referencedIds.forEach { id ->
                rootView.findViewById<View>(id).setOnClickListener(listener)
            }
        }

但是,从ConstraintLayout版本2.0.0-beta2开始,这似乎不起作用。该代码有效期至2.0.0-alpha3。我已经使用多个ConstraintLayout实现了,所以可以使用嵌套约束布局了吗?

我正在使用MotionLayout和其他约束布局动画,因此不能使用较低版本的ConstraintLayout

1 个答案:

答案 0 :(得分:1)

可用的组引用ID发生了变化。在 2.0.0-beta2 之前,它们可以在onCreate()中立即使用。似乎在 2.0.0-beta2 中,它们仅在布局后可用。我不确定这是有记载的还是只是副作用。

以下内容将在 2.0.0-beta2 中为您工作:

class MainActivity : AppCompatActivity() {
    fun Group.setAllOnClickListener(listener: View.OnClickListener?) {
        referencedIds.forEach { id ->
            rootView.findViewById<View>(id).setOnClickListener(listener)
        }
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // Referenced ids are not available here but become available post-layout.
        layout.post {
            group.setAllOnClickListener(object : View.OnClickListener {
                override fun onClick(v: View) {
                    val text = (v as Button).text
                    Toast.makeText(this@MainActivity, text, Toast.LENGTH_SHORT).show()
                }
            })
        }
    }
}