Angus
Angus

Reputation: 12631

Databinding in android displays empty

I am new to android and trying out the example of data binding as below. The text is not displayed, rather an empty box is displayed.

build.gradle :

databinding {
  enabled = true 
}

HelloWorld.java :

package com.example.android.databinding;

public class HelloWorld {
    public String getText() {
        return "My Name is ";
    }
}

MainActivity.java :

package com.example.android.databinding;

import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil;

import android.os.Bundle;

import com.example.android.databinding.databinding.ActivityMainBinding;

public class MainActivity extends AppCompatActivity {
    HelloWorld mViewModel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ActivityMainBinding activityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
        activityMainBinding.setViewModel(mViewModel);
        activityMainBinding.executePendingBindings();
    }
}

activity_main.xml :

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">
    <data>
            <variable
                name="viewModel"
                type="com.example.android.databinding.HelloWorld" />
    </data>
    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{viewModel.text}"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

Output :

enter image description here

Upvotes: 1

Views: 343

Answers (1)

Zain
Zain

Reputation: 40878

You need to instantiate the HelloWorld class before sending it via DataBinding

mViewModel = new HelloWorld();
activityMainBinding.setViewModel(mViewModel);

Also, you don't have a filed text in HelloWorld class, so android:text="@{viewModel.text}" won't get compiled.

So you need to add it, and set its value, I am using constructor in that:

public class HelloWorld {
    String text;

    public HelloWorld()  {
         text = getText();
    }
    public String getText() {
        return "My Name is ";
    }
}

Upvotes: 1

Related Questions