简体   繁体   English

如何在Android Studio的数据绑定中将值传递给android.view.View.OnClickListener的变量?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM