#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. Я сделал аналогичную вещь, чтобы решить мою проблему, спасибо!