DataBinding Intro

From Hackmd : https://hackmd.io/FvbiZ6c9TLCS11_xEUM37w?both

outline


Basic Setting


Gradle

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

xml : activity_info.xml

<layout> 
    <LinearLayout 

    </LinearLayout>  
</layout>

Bind

ActivityInfoBinding mBinding 
= DataBindingUtil.setContentView(this, R.layout.activity_info);

Usage

mBinding.XXXX

Binding Data


Object (Kotlin)

@SuppressLint("ParcelCreator")  
@Parcelize  
class User(  
    @SerializedName("name")  
    var mName: String?
): Parcelable

xml

<layout> 
    <data>
        <variable name="user" type="com.example.User"/>  
    </data>

    <LinearLayout 
        
    </LinearLayout>  
</layout>

bind

mBinding.setUser(getUser());

Usage

<TextView   
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="@{user.MName}"/>


Case 1 : Re-use


idea


Just do it


重複性太高


include xml (或是使用merge)


original xml


activity have to handle the change


mBinding.layoutAb.image.setImageDrawable(R.drawable.xxx);  
mBinding.layoutAb.textView.setText(getString(R.string.xxx));
mBinding.layoutCd.image.setImageDrawable(R.drawable.xxx);  
mBinding.layoutCd.textView.setText(getString(R.string.xxx));
mBinding.layoutEf.image.setImageDrawable(R.drawable.xxx);  
mBinding.layoutEf.textView.setText(getString(R.string.xxx));
mBinding.layoutGh.image.setImageDrawable(R.drawable.xxx);  
mBinding.layoutGh.textView.setText(getString(R.string.xxx));


another way

inclucde xml

<data>  
    <variable name="text" type="String"/>  
    <variable name="icon" type="android.graphics.drawable.Drawable"/>
</data>

TextView :

android:text="@{text}"

ImageView :

android:src="@{icon}"

orginal xml

app:icon="@{@drawable/myDrawable}"
app:text="@{@string/myText}"

result


Timing


Case 2 : Listener


xml


setOnClickListener

X

mBinding.layoutInclude1.setOnClickListener

O

findViewById(R.id.layoutInclude1).setOnClickListener();

another way

include xml

1.

<variable name="handler" type="XXXXXX.MainActivity"/>

2.

<variable name="handler" type="yourHandler"/>

android:onClick=”@{handler::onFeaturesClick}”


result in Activity

mBinding.layoutInclude1.setHandler(this);
public void onFeaturesClick(View view){}

advantage

Collect all handler together


Case 3 : String concat


Example

地址:XXXXXX


First way

<TextView
    android:text="@string/address"/>
<TextView
    android:text="@{info.address}"/>

second way

<TextView
    android:id="@+id/textAddress"
    android:text=""/>
mBinding.textAddress.setText(
getString(R.string.address) + info.address);

third way

<TextView
    android:id="@+id/textAddress"
    android:text="@{@string/address + info.address}"/>

another Example

output: 2018/2/15 16:48

mBinding.textTime.setText(
info.date + " " + info.time);

you can write

<TextView
    android:text="@{info.date + ` ` + info.time}"/>

little conclusion

1.顯示邏輯到底要寫在UI中還是必須拉到acitvity中 2.都寫在UI中會不會造成後面閱讀的人的困擾


Case 4 : hide widget


solution

android:visibility="@{isVisible ? View.VISIBLE : View.GONE}"
app:isVisible="@{true}"