ConstraintLayout
中的Group
只是一组松散关联的视图,据我所知,并不是一个ViewGroup
,因此您将无法像在ViewGroup
中使用单个点击侦听器那样使用它。
作为替代方案,您可以在代码中获取作为成员的Group
的ID列表,并显式地设置点击侦听器。有关此功能的文档,请参见getReferencedIds
的此处。
Java:
Group group = findViewById(R.id.group);
int refIds[] = group.getReferencedIds();
for (int id : refIds) {
findViewById(id).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
}
});
}
在 Kotlin 中,你可以为此构建一个扩展函数。
Kotlin:
fun Group.setAllOnClickListener(listener: View.OnClickListener?) {
referencedIds.forEach { id ->
rootView.findViewById<View>(id).setOnClickListener(listener)
}
}
然后在该组上调用此函数:
group.setAllOnClickListener(View.OnClickListener {
})
更新
虽然在 2.0.0-beta1 及之前版本中能够立即使用参考的 ids,但是它们在 2.0.0-beta2 中不可用。请按照上面的代码进行布局后再获取参考 ids。类似下面这样的代码可以正常工作。
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)
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()
}
})
}
}
}
这适用于2.0.0-beta2 之前的版本,因此您只需执行此操作,而不必进行任何版本检查。
fun Group.setAllOnClickListener(listener: (View) -> Unit) { referencedIds.forEach { id -> rootView.findViewById(id).setOnClickListener(listener)
}
}
- lucas_salesGroup
的扩展功能是否已经实现,以便我可以像对待ViewGroup
一样,仅为该Group
设置一个点击监听器? - Richard