在MVVM中动态地扩展视图

时间:2018-05-17 15:50:18

标签: android mvvm

我是DataBinding的新手,无法弄清楚如何在MVVM中动态扩充视图

更具体地说,要求是使用“添加”按钮上的2个TextViews来点击布局,并删除“删除按钮上的视图”。

没有MVVM,事情似乎很简单,但MVVM可以帮助我完成同样的工作。

1 个答案:

答案 0 :(得分:-1)

此示例使用Kotlin作为主要语言。

在您的gradle(app模块)中启用数据绑定

apply plugin: 'kotlin-kapt'

android {
    ...
    dataBinding {
        enabled = true
    }
    ...
}

dependencies {
    ...
    // LiveData + ViewModel
    implementation "android.arch.lifecycle:extensions:1.1.1"
    ...
}

现在创建三个文件,如:

  • TestViewModel //它将包含将信息提供给View的模型(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的类(位置:app&gt; build&gt;生成&gt;源&gt; apt&gt; debug&gt; com.yourpackage&gt; 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
    }
}

瞧,这就是   result

我将示例上传到github,问候