4

View をネストすることなく、複雑なレイアウトを構築できるように、 ConstraintLayoutand を使用してレイアウトを作成しました。ConstraintLayout私の場合、複数のビュー クリック イベントが必要です。

コード内のメンバーであるIDのリストを取得し、クリックリスナーを設定Groupできるため、使用してみました。Group

 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

4

1 に答える 1

2

グループの参照 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()
                }
            })
        }
    }
}
于 2019-07-18T11:57:09.817 に答える