为什么 "enabled" 和 "pressed" 属性适用于 ImageButton?

Why does "enabled" and "pressed" attributes work for ImageButton?

在哪里可以看到 Android 中所有视图类型的所有属性列表?

我的印象是 ImageButton 没有 enabledpressed 属性。至少,当我在 XML 中设置它们时,它们不起作用。我还发现了很多关于如何使这些按钮禁用 and/or 按下的 "guides"。

同时,当我用数据绑定绑定它们时

   <ImageButton
            android:id="@+id/locate_button"
            android:layout_width="64dp"
            android:layout_height="64dp"
            android:layout_toRightOf="@id/bookmark_button"

            android:enabled="@{activity.locateEnabled}"
            android:pressed="@{activity.locatePressed}"
            android:onClick="@{activity.onLocateClick}"


            android:src="@drawable/locate_selector"
            android:background="@null"
            />

他们刚刚工作。既按下又启用。同时 pressed 甚至被 Android Studion 拼写检查报告为未知 属性!

那么,它是什么?

1) 设计行为,我只是不明白某些事情(什么?)

2) 来自数据绑定库的糖

3) 黑客攻击

4) ????

如何知道此功能的便携性如何?

答案是 1 和 2。数据绑定将允许您使用属性调用视图上的任何 setter。你可以看看data binding guide's section on attribute setters.

当您设置 android:enabled 属性时,您正在使用 Android 数据绑定的自动 setter 调用 setEnabled()。 Android 数据绑定查看属性名称(已启用)并查找具有该名称的 setter 并找到 setEnabled()android:pressed 也是如此——有一个setPressed() 方法。约定俗成!

android:onClick 是一个真正的属性,但数据绑定不使用它。也没有 setOnClick() 方法。相反,有一个 Binding Adapter 设置了一个 OnClickListener 来调用您的 onLocateClick() 方法。这其中有一点魔法依赖于数据绑定用来检查您的代码的注释处理器,但足以说明它在编译时执行此操作而不是使用运行时反射。

所有事件侦听器都应该为它们编写绑定适配器,并使用与事件相同的名称(而不是侦听器名称)。因此,您也可以设置 android:onLongClick,例如。您可能还对 lambda syntax for events.

感兴趣

我不确定你所说的 "portable." 数据绑定至少可以用于姜饼(我们声称 Froyo,但实际上,谁以 Froyo 为目标?),但你将无法将它转移到 iOS 或类似的东西。所有 Android 数据绑定都是使用小型运行时库和生成的代码完成的。您不必担心 Android.

的特定版本