Вы можете получить доступ к представлениям без findViewById
, используя плагин kotlin-android-extensions
и интерфейс LayoutContainer
.
В своем файле build.gradle
убедитесь, что вы применили плагин и установили экспериментальный флаг:
apply plugin: 'kotlin-android-extensions'
androidExtensions {
experimental = true
}
Класс, из которого вы хотите получить доступ к list_view
, должен реализовывать интерфейс LayoutContainer
.Реализация этого интерфейса означает, что вам нужно предоставить контейнерное представление, в котором можно найти ваш ListView
.
Теперь давайте предположим, что у нас есть простой макет, который мы используем для MainActivity
:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
В нашем MainActivity
мы используем этот файл с setContentView
.
Теперь вы можете написать класс, который не является действием, но может использовать представление (TextView
в этом примере) без использования findViewById
:
package com.example.playground
import android.view.View
import kotlinx.android.extensions.LayoutContainer
import kotlinx.android.synthetic.main.activity_main.*
class Demo(override val containerView: View?) : LayoutContainer {
fun setTextViewText(text: String) {
text_view.text = text
}
}
Класс реализует LayoutContainer
(это возможно только при первом включении экспериментальных функций) и, следовательно, должен предоставить свойство containerView
, которое он получает черезКонструктор.
Теперь, чтобы использовать этот класс, например, из действия, вам нужно создать его экземпляр и дать ему представление, в котором существует text_view
(LinearLayout
с идентификатором container
в моем случае):
val demo = Demo(container)
demo.setTextViewText("Magic!")
Вы не сможете использовать kotlinx.android.synthetic
-магию без предоставления контейнера.Потому что в основном то, что происходит в фоновом режиме, это то, что если вы получаете доступ к list_view
, расширение делает findViewById
.
Online, вы можете найти дополнительную информацию из Kotlin о плагине Android и о как использовать расширения Android .