Android 安卓系统:<;声明可设置样式>;方法属性
如何在属性中接受方法作为值? 与视图的onClick属性类似:Android 安卓系统:<;声明可设置样式>;方法属性,android,declare-styleable,Android,Declare Styleable,如何在属性中接受方法作为值? 与视图的onClick属性类似: <Button android:onClick="onClickMethod"/> 如何定义接受方法的自定义属性 我知道我们在参考资料中使用了,但如何让它接受方法呢 Android使用反射来查找方法的名称并调用它。您可以在第4209行开始的源代码中看到一个示例 如果方法名不为null,它将创建一个新的DeclareOnClickListener()类,并使用方法名对其进行初始化 DeclareOnClickLis
<Button android:onClick="onClickMethod"/>
如何定义接受方法的自定义属性
我知道我们在参考资料中使用了
,但如何让它接受方法呢 Android使用反射来查找方法的名称并调用它。您可以在第4209行开始的源代码中看到一个示例
如果方法名不为null,它将创建一个新的DeclareOnClickListener()
类,并使用方法名对其进行初始化
DeclareOnClickListener()
类在第4435行定义
解决方案:
我用:BindingAdapter和Lambda解决了这个问题
一,️⃣ ➖ 使用lambdagetter函数实现CustomView
二,️⃣ ➖ 在build.gradle(:app)中添加数据绑定和kapt
三,️⃣ ➖ 实现绑定适配器
@BindingAdapter("onItemClick")
fun CustomView.onItemClick(block: () -> Unit) {
this.onItemClick(block)
}
<layout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="activityMain"
type="com.veldan.MainActivity" />
</data>
<com.veldan.CustomView
android:id="@+id/recycle"
android:layout_width="match_parent"
android:layout_height="match_parent"
onItemClick="@{() -> activityMain.onItemClick()}" />
</layout>
四,️⃣ ➖ 使用BindingAdapter
@BindingAdapter("onItemClick")
fun CustomView.onItemClick(block: () -> Unit) {
this.onItemClick(block)
}
<layout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="activityMain"
type="com.veldan.MainActivity" />
</data>
<com.veldan.CustomView
android:id="@+id/recycle"
android:layout_width="match_parent"
android:layout_height="match_parent"
onItemClick="@{() -> activityMain.onItemClick()}" />
</layout>
附言:热爱你所做的。我懂了。但是安卓的格式是什么:onClick?如果我尝试使用attr的引用格式,ide会抱怨无法解析符号:
app:myOnClick=“onClickMethod”
您对myOnClick的声明应该如下所示。使用字符串是因为它是用来查找方法名的。它很有效!但是他们如何自动完成onClick的方法呢?
<layout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="activityMain"
type="com.veldan.MainActivity" />
</data>
<com.veldan.CustomView
android:id="@+id/recycle"
android:layout_width="match_parent"
android:layout_height="match_parent"
onItemClick="@{() -> activityMain.onItemClick()}" />
</layout>
class MainActivity : AppCompatActivity() {
private val TAG = this::class.simpleName
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater).also {
it.activityMain = this
setContentView(it.root)
}
}
fun onItemClick() {
Log.i(TAG, "onItemClick: ")
}