Я новичок в котлине. Я нашел и попытался использовать синтетический метод вместо раздражающего метода findViewById
в моем Activity
классе, но я обнаружил: «Если мы хотим вызвать синтетические свойства в представлении (полезно в классах адаптеров), мы также должны импортировать kotlinx.android.synthetic.main .Посмотреть.*." Но я не могу понять, как именно это работает? Есть примеры?
kotlin
kotlin-android-extensions
занятой
источник
источник
Ответы:
Простой пример из https://github.com/antoniolg/Kotlin-for-Android-Developers
import kotlinx.android.synthetic.item_forecast.view.* class ForecastListAdapter() : RecyclerView.Adapter<ForecastListAdapter.ViewHolder>() { class ViewHolder(view: View) : RecyclerView.ViewHolder(view) { fun bindForecast(forecast: Forecast) { itemView.date.text = forecast.date.toDateString() } } }
Не нужно писать
val view = itemView.findViewById(R.id.date) as TextView view.text = forecast.date.toDateString()
Просто
Просто и эффективно!
источник
Котлинг 1.1.4 выход
Дополнительная информация: https://antonioleiva.com/kotlin-android-extensions/
Вам необходимо включить расширения Kotlin для Android, добавив это в свой build.gradle:
apply plugin: 'org.jetbrains.kotlin.android.extensions' androidExtensions { experimental = true }
Начиная с этой новой версии Kotlin, расширения Android включают некоторые новые интересные функции: кеши в любом классе (который, что интересно, включает ViewHolder)
Используя его в ViewHolder (или любом настраиваемом классе). Обратите внимание, что этот класс должен реализовывать
LayoutContainer
интерфейс:class ViewHolder(override val containerView: View) : RecyclerView.ViewHolder(containerView), LayoutContainer { fun bind(title: String) { itemTitle.text = "Hello Kotlin!" } }
источник
1.3.21
. Я думаю, они не собираются это реализовыватьcontainerView.itemTitle.text = "Hello Kotlin!"
и я думаю, что этого достаточноТебе нужно
import kotlinx.android.synthetic.row_wall.view.*
А потом что-то вроде:
Дело в том, что view. * Вводит расширения в класс View.
источник
Пытаться
class CustomViewModel(val baseView: View) { val firstName = baseView.firstName val lastName = baseView.lastName }
Объект представления предоставляет представления ref: https://discuss.kotlinlang.org/t/unable-to-use-kotlin-android-extension-in-adapter-class/2890
источник
Если вы используете последнюю версию l;., Вам не нужно добавлять к ней экспериментальный = true.
на уровне проекта Gradle
classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.21'
И на уровне приложения Gradle
apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' //These should be on the top of file.
и в зависимостях ..
implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.21'
и импортируйте ниже как
import kotlinx.android.synthetic.main.your_layout_file_name.view.*
и пример
import kotlinx.android.synthetic.main.item_animal.view.* class AnimalVH(parent: ViewGroup, layoutID: Int) : BaseViewHolder<Animal>(parent, layoutID) { override fun bindData(animal: Animal) { itemView.tv_animal.text = animal.title } }
где BaseViewHolder - это
abstract class BaseViewHolder<T>(parent: ViewGroup, layoutID: Int) : RecyclerView.ViewHolder( LayoutInflater.from(parent.context).inflate(layoutID, parent, false) ) { abstract fun bindData(model: T) }
источник
.view.*
импортированных поражений будет цельюfindViewById<>
, и каждый раз откат будет заключаться в том , что сам шаблонViewHolder
отговаривает.Это означает, что вы должны поместить эту строку в начало исходного файла:
import kotlinx.android.synthetic.main.view.*
Так что теперь вместо, например,
findView(R.id.textView) as TextView
вы должны написать простоtextView
. Последнее является синтетическим свойством расширения, находящимся в пакетеkotlinx.android.synthetic.main.view
, поэтому вам нужно импортировать все из него.На официальном сайте есть учебник , посмотрите.
источник
findViewById()
метод дляView
типаholder.findViewById(R.id.name)
. С помощью расширений Kotlin для Android вы можете писать простоholder.name
. Предположим, что этот код написан внутриgetView()
функции:val base = inflater.inflate(R.layout.list_item, parent, false)
base.name.text = "John Smith"
К вашему сведению: для просмотра представлений рекомендуется связывание данных, а не синтетическое.
Комментарий DA for Android от Google на Reddit
источник