2017-06-20 22 views
0

私は画像とタイトルが含まれているカスタムレイアウトを作成しました。このレイアウトを再利用するには、<include>タグを使用しています。問題は、私もに含まれているレイアウトに文字列リテラルすることができないということです。私はこれらを踏襲しようとしたが、成功しなかった。instructions。 Gradleで静的データ・バインディングのAndroidで[リテラル]

レイアウト/ 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> 

Iは、モジュールのデータ・バインディングを使用可能にしている:

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

はこのように私はActivityクラスからのデータをバインドする必要があり、あなたのアクティビティ/フラグメント –

+0

@RaviRupareliyaにそのXMLを結合していることを確認し、動作するはず?私は渡す文字列定数は、クラスに何かを書く必要はありません。 xmlから定数をバインドする方法はありますか? – matoni

+1

私はそれを試していないが、少なくともあなたのXMLをバインドする必要があります。まだ私はわからないが、あなたは 'DatabindingUtil.setContentView(この、)のような活動の結合とそれを試してみることができます;' –

答えて

0

固定レイアウト/ otherlayout.xml @CzarMattの回答に基づいて

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

データ - バインディングは@RaviRupareliyaが示唆しているようにDataBindingUtilを介してレイアウトを設定する必要があります。それ以外の場合はデータバインディングはできません作品:

public class OtherActivity extends Activity { 

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

ドキュメントから:

変数が含まれるレイアウトのは、これは、次のデータ変数が含まれていなければならない、ということを意味

属性にアプリケーションの名前空間と変数 名を使用してレイアウトを含む からのバインディングに渡されます

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

<include>になっているはずです。両方ごtitlebarotherlayout XMLファイルでこのように:

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

詳細については、データバインディングのドキュメントを参照してください:

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

関連する問題