I have created custom layout which contains image and title. To reuse this layout I’m using <include>
tag. The problem is that I’m not even able to bind string literal into the layout being included. I tried to follow these instructions, but without success.
layout/titlebar.xml
<?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="title" type="String"/> <!-- <variable name="imgSrc" type="android.graphics.drawable.Drawable" /> --> </data> <LinearLayout ... > <!-- <ImageView ... android:src="{imgSrc}" /> --> <TextView ... android:text="@{title, default=DefaultTitle}" /> </LinearLayout> </layout>
layout/otherlayout.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:bind="http://schemas.android.com/apk/res-auto" ... > <!-- bind:imgSrc="@{@drawable/some_image}" --> <include layout="@layout/titlebar" bind:title="@{Example}" <---------- does not work /> ... </LinearLayout>
In gradle I have enabled data-binding for module:
android { ... dataBinding { enabled = true } ... }
Answer
Fixed layout/otherlayout.xml based on @CzarMatt answer
<?xml version="1.0" encoding="utf-8"?> <!-- layout with bindings has to be wrapped in <layout> tag so {LayoutName}Bindings class can be auto-generated for binding purposes xmlns:alias="http://schemas.android.com/apk/res-auto" creates an "app namespace" for custom attributes --> <layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:bind="http://schemas.android.com/apk/res-auto"> <LinearLayout ... > <!-- // if this layout is also using title "data variable" // and we want to use default value if title is null bind:title='@{title ?? "Settings"} // passing literal reference into the binding bind:title="@{@string/settings_constant}" --> <include layout="@layout/titlebar" bind:title='@{"Settings"}' /> ... </LinearLayout> </layout>
Data-binding requires to set layout via DataBindingUtil
as @RaviRupareliya suggested, otherwise data-binding will not work:
public class OtherActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // setContentView(R.layout.otherlayout); DataBindingUtil.setContentView(this, R.layout.otherlayout); } ... }