Search code examples
androidmvvmkotlinmutablelivedata

How to use a MutableLiveData Object in my xml?


I have an object that will fill some fields in my xml, but a mutablelivedata return a T value and I can't use the T properties. What I need to do to use the T object in my xml?

I don't want to create a mutablelivedata for each object member.

Sorry for my bad english..

class ExampleFragment: Fragment() {
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        val viewModel = ViewModelProviders.of(this).get(MyVm::class.java)

        val binding = DataBindingUtil.inflate<FragmentExampleBinding>(
            inflater,
            R.layout.fragment_house,
            container,
            false
        )

        binding.myVm = viewModel
        binding.lifecycleOwner = this

        return binding.root
    }
}
class MyVm: ViewModel(){
    val house: MutableLiveData<House> by lazy { MutableLiveData<House>().apply{ value = 
        House().apply{ 
            door = "First door"
            window = "My window"
        }
    } }

    val thing: MutableLiveData<String> by lazy { MutableLiveData<String>().apply{ value = "something" } }
}
class House(){
    var door: String = ""
    var window: String = ""
}
<layout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto">

    <data>
        <variable name="my_vm" type="br.com.MyVm"/>
    </data>

    <LinearLayout
        android:layout_width="match_parent" 
        android:layout_height="match_parent"
        orientation="vertical"
        >

        <!--I need this work-->
        <TextView 
            android:layout_width="wrap_parent" 
            android:layout_height="wrap_parent"
            android:text="my_vm.house.door"
        />

        <!--I need this work-->
        <TextView 
            android:layout_width="wrap_parent" 
            android:layout_height="wrap_parent"
            android:text="my_vm.house.window"
        />

        <TextView 
            android:layout_width="wrap_parent" 
            android:layout_height="wrap_parent"
            android:text="my_vm.thing"
        />
    </LinearLayout>

<layout>

Solution

  • This code is correcty! A tried run and worked, I thounght it didn't work because the android studio didn't show the attributes when press ctrl + space.