基本上,我希望将一个OnClickListener附加到ConstraintLayout中的多个视图.

在迁移到ConstraintLayout视图之前,我可以在一个布局中添加一个侦听器.现在,它们与ConstraintLayout下的其他视图位于同一层.

我try 将视图添加到android.support.constraint.Group,并以编程方式向其添加了OnClickListener.

group.setOnClickListener {
    Log.d("OnClick", "groupClickListener triggered")
}

然而,从ConstraintLayout版本1.1.0-beta2开始,这似乎不起作用

Have I done something wrong, is there a way to achieve this behaviour or do I need to attach the listener to each of the single views?

推荐答案

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之前的版本,所以您只需执行此操作,而无需执行任何版本判断.

Kotlin相关问答推荐

如何使用收件箱文件中的类运行Kotlin应用程序

Android前台服务 list —Altbeacon

Kotlin协程挂起继续线程

如何让Gradle8+在编译Kotlin代码之前编译Groovy代码?然后把它们混合在一个项目中?

如何避免使用公共类实现内部接口

Kotlin-elvis算子don';不使用map.get()

当我通过媒体通知更改音乐时不要更新我的 UI

为什么Kotlin有次构造函数和init块?

Kotlin中用于调用常量名称的枚举类方法之间的区别

如何使用 Firebase 和 Kotlin 在文本 (Jetpack Compose) 中显示当前用户名?

Kotlin - 创建指定长度的随机整数的 ArrayList?

在 kotlin 中模拟伴随对象函数

Kotlin 中多个 init 块的用例?

如何在MVVM架构中观察RecyclerView适配器中的LiveData?

面临一些未知问题一些后端jvm内部错误

如何暂停kotlin coroutine直到收到通知

在 gradle android library kotlin 项目中禁用 META-INF/* 生成

如何在特定条件下清除jetpack数据存储数据

Kotlin数据类打包

保存对象时未填充 Spring Boot JPA@CreatedDate @LastModifiedDate