android - 在 ConstraintLayout 中使用 group 来监听多个 View

基本上我想将单个 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 项目设置

kotlin - 如何从包类名称字符串中获取 Kotlin KClass?

lambda - 在 lambda 中使用 return?

android - 使用 Kotlin for Android 进行数据绑定(bind)的问题