繁体   English   中英

Android中的静态数据绑定[literals]

[英]Static data-binding in Android [literals]

我创建了包含图像和标题的自定义布局 要重用此布局,我使用的是<include>标记。 问题是我甚至无法将字符串文字绑定到包含的布局中。 我试图遵循这些说明 ,但没有成功。

布局/ 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>

布局/ 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>

在gradle中,我为模块启用了数据绑定:

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

修复了基于@CzarMatt答案的layout / otherlayout.xml

<?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>

数据绑定需要通过DataBindingUtil设置布局,如@RaviRupareliya建议的那样,否则数据绑定将不起作用:

public class OtherActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState); 
        // setContentView(R.layout.otherlayout);
        DataBindingUtil.setContentView(this, R.layout.otherlayout);
    }
    ...
}

来自文档:

通过使用应用程序命名空间和属性中的变量名,可以将变量传递到包含布局的包含布局的绑定中

这意味着,以下数据变量必须包含在titlebar和其他otherlayout XML文件中:

<data>
    <variable name="title" type="java.lang.String"/>
</data>

并且<include>应该看起来像这样:

<include layout="@layout/titlebar"
       bind:title="@{title}"/>

有关更多信息,请参阅数据绑定文档:

https://developer.android.com/topic/libraries/data-binding/index.html#includes

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM