Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/216.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 安卓系统:<;声明可设置样式>;方法属性_Android_Declare Styleable - Fatal编程技术网

Android 安卓系统:<;声明可设置样式>;方法属性

Android 安卓系统:<;声明可设置样式>;方法属性,android,declare-styleable,Android,Declare Styleable,如何在属性中接受方法作为值? 与视图的onClick属性类似: <Button android:onClick="onClickMethod"/> 如何定义接受方法的自定义属性 我知道我们在参考资料中使用了,但如何让它接受方法呢 Android使用反射来查找方法的名称并调用它。您可以在第4209行开始的源代码中看到一个示例 如果方法名不为null,它将创建一个新的DeclareOnClickListener()类,并使用方法名对其进行初始化 DeclareOnClickLis

如何在属性中接受方法作为值? 与视图的onClick属性类似:

<Button android:onClick="onClickMethod"/>

如何定义接受方法的自定义属性


我知道我们在参考资料中使用了
,但如何让它接受方法呢

Android使用反射来查找方法的名称并调用它。您可以在第4209行开始的源代码中看到一个示例

如果方法名不为null,它将创建一个新的
DeclareOnClickListener()
类,并使用方法名对其进行初始化

DeclareOnClickListener()
类在第4435行定义 解决方案: 我用:BindingAdapter和Lambda解决了这个问题


一,️⃣ ➖ 使用lambda
getter函数实现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: ")
}