2016-04-04 4 views
5

私は2つのレイアウトを持っています.1つはv19 +用、もう1つは以前のバージョンです。それらは異なるIDを持つ異なるビューを含んでいます。どのように私は両方のレイアウトで動作するようにAndroidのデータバインディングフレームワークを言うことができますか? 1つのレイアウト(ランダムに選択)のビューのみを生成します。いくつかの修飾子を使ってレイアウトをバインドする方法

レイアウト/ temp_view.xml:

<layout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools"> 

    <data> 

     <variable 
      name="block" 
      type="ru.temp.model.content.blocks.WebMediaBlock" /> 

     <import type="ru.temp.model.Types.ProviderTypes" /> 

    </data> 

    <FrameLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" 
     tools:background="@android:color/white"> 

     <ImageView 
      android:id="@+id/provider" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center_horizontal" 
      android:paddingTop="@dimen/size5" 
      android:src="@{ProviderTypes.fromString(block.provider).getResId()}" /> 
    </FrameLayout> 
</layout> 

レイアウト-V19/temp_view.xml:

<layout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools"> 

    <data> 

     <variable 
      name="block" 
      type="ru.temp.model.content.blocks.WebMediaBlock" /> 

     <import type="ru.temp.model.Types.ProviderTypes" /> 

    </data> 

    <FrameLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" 
     tools:background="@android:color/white"> 
     <ru.temp.utils.EmbedView 
      android:id="@+id/media_embed" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" /> 

     <ru.temp.structure.static_material.CreditsView 
      android:id="@+id/credits_view" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" /> 
    </FrameLayout> 
</layout> 

を更新:

最後に、私は、問題の根本を発見しました。理由は分かりませんが、minSdkVersionを使用するとBindingImplファイルが生成されません。21.以前のバージョンを指定すると、@yigitと同じように動作します。

+0

参考までに[こちら](http://chintanrathod.com/develop_apps_faster_using_data_binding_part2/)チュートリアルをチェックすることもできます。 –

+0

問題の詳細をカバーしていません – LackOfKnowledge

答えて

1

データバインディングは、変数)。 DataBindingUtil.setContentView(activity, R.layout.tmp_viewを呼び出すと、データバインディングによって正しいインスタンスが作成されます)。

たとえば、あなたの例では、それは

TempViewBindingTempViewBindingImplTempViewBindingV19Implを生成します。 コンパイル後に<app module>/build/intermediates/classes/<your package>/databinding/の中でこれらのクラスをチェックすることができます。

TempViewBindingは基本クラスであり、レイアウトごとに変数とビューの組み合わせがあります。 IDEで表示されない場合は、ASの自動補完のバグ(バグを報告してください)が考えられます。

+0

残念ながら、このようなImplクラスは生成されません。あなたが公式ドキュメントで提供した情報を見つけることができません。私が間違っていることを判断できません – LackOfKnowledge

+0

サンプルプロジェクトをアップロードすることができたら、それを見て嬉しいです – yigit

+0

遅刻して申し訳ありませんが、問題を検出するのに時間がかかりました。ヘッドの更新を確認してください。テストプロジェクト(マスターブランチ)https://github.com/rchugunov/buzzerを見てください。現在のバージョンでは、データバインディングはImplファイルを生成しません。しかし、build.gradleでminSdkVersion 15を設定した場合、それは実行されます! – LackOfKnowledge

関連する問題