[英]How to pass a value to the variable of android.view.View.OnClickListener in data binding in Android Studio?
The following code is from the project sunflower .以下代码来自项目sunflower 。
There is variable named clickListener
, it's a variable of android.view.View.OnClickListener
.有一个名为
clickListener
的变量,它是android.view.View.OnClickListener
的变量。
I don't know how to pass a value to the variable clickListener
of android.view.View.OnClickListener
in data binding in Android Studio, could you tell me?我不知道如何在Android Studio的数据绑定中将值传递给
android.view.View.OnClickListener
的变量clickListener
,你能告诉我吗?
And more, I can't understand that the code binding.setClickListener{...}
in PlantAdapter.kt, could you tell me?还有,我看不懂 PlantAdapter.kt 中的 binding.setClickListener
binding.setClickListener{...}
代码,你能告诉我吗?
list_item_plant.xml list_item_plant.xml
<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="clickListener"
type="android.view.View.OnClickListener"/>
...
</data>
<com.google.samples.apps.sunflower.views.MaskedCardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="@{clickListener}"
...
}
PlantAdapter.kt植物适配器.kt
class PlantAdapter : ListAdapter<Plant, RecyclerView.ViewHolder>(PlantDiffCallback()) {
...
class PlantViewHolder(
private val binding: ListItemPlantBinding
) : RecyclerView.ViewHolder(binding.root) {
init {
binding.setClickListener {
binding.plant?.let { plant ->
navigateToPlant(plant, it)
}
}
}
...
}
Added content添加内容
Normally, I define a data binding variable name
in plain_activity_solution_2.xml , I should assign a value for it such as binding.name = "Ada"
in PlainOldActivitySolution2.kt .通常,我在plain_activity_solution_2.xml中定义一个数据绑定变量
name
,我应该为它分配一个值,例如在 PlainOldActivitySolution2.kt 中的binding.name binding.name = "Ada"
。
So when I define a data binding variable clickListener
in list_item_plant.xml , I should assign a value for it such as binding.clickListener=...
in PlantAdapter.kt , But I can't find binding.clickListener=...
in PlantAdapter.kt , instead I only find binding.setClickListener {...}
, why?因此,当我在list_item_plant.xml中定义数据绑定变量
clickListener
时,我应该为其分配一个值,例如 PlantAdapter.kt 中的 binding.clickListener binding.clickListener=...
,但我在PlantAdapter中找不到binding.clickListener binding.clickListener=...
.kt ,而我只找到 binding.setClickListener binding.setClickListener {...}
,为什么?
plain_activity_solution_2.xml plain_activity_solution_2.xml
<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="name"
type="String"/>
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/plain_name"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="@{name}"
...
}
PlainOldActivitySolution2.kt PlainOldActivitySolution2.kt
class PlainOldActivitySolution2 : AppCompatActivity() {
// Obtain ViewModel from ViewModelProviders
private val viewModel by lazy { ViewModelProviders.of(this).get(SimpleViewModel::class.java) }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding: PlainActivitySolution2Binding =
DataBindingUtil.setContentView(this, R.layout.plain_activity_solution_2)
binding.name = "Ada"
binding.lastName = "Lovelace"
}
...
}
I don't understand what variable you're trying to pass, and why.我不明白您要传递什么变量,以及为什么。
But to pass any variable you can use a lambda expression like this:但是要传递任何变量,您可以使用 lambda 表达式,如下所示:
android:onClick="@{() -> clickListener(someVariable, someOtherVariable)}"
If you need the view, you can pass it like that:如果你需要视图,你可以像这样传递它:
android:onClick="@{(view) -> clickListener(view)}"
The binding
is there own class, normally android View.OnClickListener
is passing just Button
as casted View
, you can't add more, but you can listen with View.OnClickListener
then find real object and pass to your own listeners. binding
是有自己的 class,通常是 android View.OnClickListener
只是传递Button
作为铸件View
,你不能添加更多,但你可以用View.OnClickListener
收听,然后找到真正的 ZA8CFDE6331BD59EB2AC96F8911ZB 监听器并传递给你自己的监听器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.