В этом примере в качестве основного языка используется Kotlin.
Включение привязки данных в вашем Gradle (модуль приложения)
apply plugin: 'kotlin-kapt'
android {
...
dataBinding {
enabled = true
}
...
}
dependencies {
...
// LiveData + ViewModel
implementation "android.arch.lifecycle:extensions:1.1.1"
...
}
Теперь создайте три файла, например:
- TestViewModel // Он будет содержать модели, которые будут питать информацию для представления (test_fragment_layout)
- TestFragment // Он будет содержать экземпляр TestViewModel и FragmentTestBinding (автоматически сгенерированный класс)
- layout_test_fragment.xml// Макет FragmentTest
Теперь добавьте две строки в TestViewModel ...
class TestViewModel: ViewModel() {
private var textA: String? = null
private var textB: String? = null
fun setUp(textA: String, textB: String) {
this.textA = textA
this.textB = textB
}
//Kotlin needs explicit getters, used by autogenerated class
fun getTextA() = textA
fun getTextB() = textB
}
Теперь создайте TestFragment и его layout_test_fragment.xml
Макет будет выглядетькак это:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="viewModel"
type="com.test.viewmodel.TestViewModel" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".TestFragment">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@{viewModel.textA}" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@{viewModel.textB}" />
</LinearLayout>
</layout>
Имея макет, скомпилируйте ваш проект, и AndroidStudio создаст класс с именем FragmentTestBinding (location: app> build> generate> source> apt> debug> com.yourpackage> FragmentTestBinding)
Наконец, в TestFragment добавьте следующие строки
class TestFragment : Fragment() {
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
val binding = FragmentTestBinding.inflate(inflater, container, false)
val viewModel = ViewModelProviders.of(this).get(TestViewModel::class.java)
viewModel.setUp("Hello World", "from DataBinding")
binding.viewModel = viewModel
return binding.root
}
}
И вуаля, это результат .
Я загрузил пример в github , привет