基本上我想将单个 OnClickListener 附加到 ConstraintLayout 内的多个 View 。
在迁移到 ConstraintLayout 之前,我可以在一个布局中添加一个监听器的 View 。现在它们与 ConstraintLayout 下的其他 View 位于同一层。
我尝试将 View 添加到 android.support.constraint.Group
并以编程方式向其中添加 OnClickListener。
group.setOnClickListener {
Log.d("OnClick", "groupClickListener triggered")
}
但是,这似乎不适用于 ConstraintLayout 版本 1.1.0-beta2
我做错了什么,有没有办法实现这种行为,或者我需要将监听器附加到每个单独的 View ?
最佳答案
ConstraintLayout
中的 Group
只是 View AFAIK 的松散关联。它不是 ViewGroup
,因此您将无法像 View 位于 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)
}
}
然后调用组上的函数:
group.setAllOnClickListener(View.OnClickListener {
// code to perform on click event
})
更新
虽然它们在 2.0.0-beta1 和之前的版本中,但引用的 id 在 2.0.0-beta2 中不会立即可用。 “发布”上面的代码以在布局后获取引用 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 之前的版本,因此您可以这样做,而不必进行任何版本检查。
关于android - 在 ConstraintLayout 中使用 group 来监听多个 View 的点击事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46743944/
相关文章:
android - 在 Android Studio 中创建 Kotlin 库
types - Kotlin:从列表(或其他功能转换)中消除空值
kotlin - 从 java 中调用作为 java 中关键字的 kotlin 函数?
android - 在 Kotlin 中将接口(interface)作为参数传递
android - 在 Kotlin 中使用 Gson 解析 JSON 数组
android - 如何在 androidTest 范围内使用 kapt
intellij-idea - Kotlin - IntelliJ 项目设置