ConstraintLayout
中的Group
只是一个松散的观点关联.它不是ViewGroup
,因此您将无法像在ViewGroup
中使用视图时那样使用单次单击侦听器.
或者,您可以在代码中获取属于Group
成员的ID列表,并显式设置单击侦听器.(我没有找到有关此功能的官方文档,但我相信它只是滞后于代码发布.)请参阅getReferencedIds
here上的文档.
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) {
// your code here.
}
});
}
在Kotlin中,您可以为此构建一个扩展函数.
Kotlin :
fun Group.setAllOnClickListener(listener: View.OnClickListener?) {
referencedIds.forEach { id ->
rootView.findViewById<View>(id).setOnClickListener(listener)
}
}
Then call the function on the group:
group.setAllOnClickListener(View.OnClickListener {
// code to perform on click event
})
Update
参考ID在2.0.0-beta2中不能立即可用,尽管它们在2.0.0-beta1和之前."发布"上面的代码,在布局后获取参考ID.像这样的东西会管用的.
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()
}
})
}
}
}
这应该适用于2.0.0-beta2之前的版本,所以您只需执行此操作,而无需执行任何版本判断.