Vinit Saxena
Vinit Saxena

Reputation: 704

How to use ObservableFields

I am new in android data binding. In the official document, I found ObservableFields can be used if you do not have much data to bundle in side a Observable Object (Correct me if I am wrong). I have a boolean variable in side an Activity class.Based on the boolean variable i need to show and hide a View. My question is how can I use ObservableBoolean inside the layout xml file and how to bind that variable from corresponding activity?

Thanks in advance.

Upvotes: 3

Views: 5768

Answers (1)

George Mount
George Mount

Reputation: 20926

There is a bug in using it directly in Android Studio 2.2 that is fixed in Android Studio 2.3. In AS 2.3, you can simply do this:

<layout>
    <data>
        <import type="android.view.View"/>
        <variable name="showView" type="android.databinding.ObservableBoolean"/>
    </data>
    <FrameLayout ...>
        <!-- more views -->
        <View android:visiblity="@{showView ? View.VISIBLE : View.GONE}" .../>
    </FrameLayout>
</layout>

And then you set it when you create the binding:

private final ObservableBoolean showView = new ObservableBoolean(true);

@Override
public void onCreate(Bundle savedInstanceState) {
    MainActivityBinding binding = DataBindingUtil.setContentView(this,
        R.layout.main_activity);
    binding.setShowView(showView);
}

With Android Studio 2.2, you'll need to have that ObservableField contained in another object. Since it is in your Activity, you can pass that. You just need to make it public (they should always be final).

<layout>
    <data>
        <import type="android.view.View"/>
        <variable name="activity" type="com.example.myproj.ActivityMain"/>
    </data>
    <FrameLayout ...>
        <!-- more views -->
        <View android:visiblity="@{activity.showView ? View.VISIBLE : View.GONE}" .../>
    </FrameLayout>
</layout>

And your Activity has it like this:

public class ActivityMain extends Activity {
    public final ObservableBoolean showView = new ObservableBoolean(true);

    @Override
    public void onCreate(Bundle savedInstanceState) {
        MainActivityBinding binding = DataBindingUtil.setContentView(this,
            R.layout.main_activity);
        binding.setActivity(this);
    }
}

Upvotes: 3

Related Questions