Могу ли я присвоить ConstraintLayout «скрытую» переменную?

#xml #android-studio #kotlin

#xml #android-studio #kotlin

Вопрос:

Я использую Kotlin, XML и Android studio.

У меня есть ConstraintLayout, который я использую в качестве «кнопки». Пользователь нажмет на нее, и это приведет их в другое место. Они процедурно генерируются в recyclerview, поэтому я не могу вводить в них данные. При их создании есть ли способ предоставить им «скрытую» переменную, на которую я могу ссылаться при нажатии на них. Если бы я использовал кнопку, я бы просто установил текст в это значение, а затем ссылался на его текст.

Ответ №1:

Вы можете присвоить макету идентификатор, который можно использовать в качестве ссылки для поиска этого представления.

Вот несколько примеров кода

 
class MyAdapter():RecyclerView.Adapter<VH>() {

 override fun onCreateView()

 override fun onBindView(holder:VH, position:Int):VH {
    holder.layout.setOnClickListener {
       //do something when view is clicked
    }
 }
 
 class VH(view:View):RecyclerView.ViewHolder(view) {
   //here you can get a reference to your layout
   val layout = view.findViewById<ConstraintLayout>(R.id.someId)
 }
 
 <androidx.constraintlayout.widget.ConstraintLayout 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"
    android:layout_width="match_parent"
    andoid:id="@ id/someId" <----- This is the important bit here
    android:backgroundTint="@android:color/white"
    android:layout_height="wrap_content">

    <TextView
        android:id="@ id/header"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:textColor="@color/primaryText"
        android:textSize="18sp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:text="Header" />
 

Комментарии:

1. Это то, что я в итоге сделал, большое вам спасибо!

Ответ №2:

Вы можете просто использовать View.setId() при создании макета — есть даже удобная generateViewId() функция, которая создаст ее для вас, которая гарантированно не будет конфликтовать с любыми идентификаторами, которые вы уже определили в R файле

Но, кроме того, onClick метод в a View.OnClickListener передает представление, на которое был нажат щелчок в качестве параметра, так что, может быть, вам не нужно ничего искать? Если вы используете лямбда-выражение, оно неявно передается как it (поскольку это единственный параметр), поэтому вы можете не осознавать его наличия, но вы можете явно назвать его как view или как угодно

 layout.setOnClickListener { view -> ... }
 

но если все это процедурно, может быть, просто использовать функцию?

 fun onLayoutClick(layout: View) { ... }
...
layout.setOnClickListener(::onLayoutClick)
 

функция имеет ту же сигнатуру (те же параметры и возвращаемый тип), что и лямбда, поэтому вы можете просто добавить ссылку на функцию следующим образом

Комментарии:

1. Я сделал аналогичную вещь, чтобы решить мою проблему, спасибо!