2016-12-01 3 views
2

Androidドキュメントは、レイアウトXMLファイルを使用してバインディングクラスを作成する方法を説明する優れた仕事をしています。しかし、私はいくつかの質問があります。Androidデータバインディングプログラムでインスタンシエートされたビュー

プログラムでインスタンス化されたカスタムビューのデータバインディングクラスを作成する方法はありますか?たとえば、2つのカスタムビュークラスがあり、xmlを使用せずに同じビューモデルオブジェクトをプログラムにバインドしたいとします。次のようにクラスは次のとおりです。

MyCustomView customView = new MyCustomView(context); 

は、どのように私はこのケースでは、データバインディングを使用して行くのです。

class MyViewModel { 
} 

class MyCustomView extends View { 
} 

class MyAnotherCustomView extends MyCustomView { 
} 

は今、私が使用してMyCustomView/MyAnotherCustomViewをインスタンス言うことができますか?これは公式のAndroidデータバインディングフレームワークを使用して可能ですか?そうでない場合、これを達成するために他のどのフレームワーク/ライブラリが利用可能か推奨されていますか?

私の2番目の質問は最初の質問のフォローアップです。私の最初の質問で私が望むことを達成することは不可能であると言います。次に、my_custom_view.xmlファイルを定義する必要があります。これは以下のようになります。私は同じバインディングロジックを維持MyCustomViewのサブクラスであるMyAnotherCustomViewを使用したい場合は

<?xml version="1.0" encoding="utf-8"?> 
<layout xmlns:android="http://schemas.android.com/apk/res/android"> 
    <data> 
     <variable name="user" type="com.example.User"/> 
    </data> 
    <com.example.name.MyCustomView 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:text="@{user.firstName}"/> 
</layout> 

は今、私はちょうどでMyCustomViewを置き換えるために新しいXMLファイルmy_another_custom_view.xmlを作成する必要がありますMyAnotherCustomViewは同じバインディングを定義しますか?

+0

'DataBindingUtilの#バインド(ビューのルート)' – pskink

+0

を参照してください私はすでにそれをチェックしたが、私のユースケースを助けていないようです。実例を投稿できますか?多分それは物事を明確にするのに役立つでしょう。ありがとう! – androholic

+0

''私はxml'を使わずに同じビューモデルオブジェクトをプログラムにバインドしたいと思っています ""ああ、申し訳ありませんが、私はそれを見逃しました。バインディングはXMLでのみ定義されるため、データとビューの間のマッピングをどのように定義したいですか? – pskink

答えて

4

最初の質問に対する回答は「いいえ」です。 Androidのデータバインディングでは、XMLがバインディングクラスを生成する必要があります。

2番目の質問では、機能するソリューションを提供します。そのルートを使用する場合は、ViewDataBinding基本クラスのセッターを使用して変数を設定します。ここで

public void addCustomView(LayoutInflater inflater, ViewGroup container, User user) { 
    ViewDataBinding binding = DataBindingUtil.inflate(inflater, 
     this.layoutId, container, true); 
    binding.setVariable(BR.user, user); 
} 

、私はカスタムビューがフィールドlayoutIdによって決定されるかの選択を想定している:私はこのような方法を想像することができます。考えられる各レイアウトはUseruser変数を定義する必要があります。

私はあなたの使い方を知らないが、ロードするカスタムビューを動的に選択する場合は、ViewStubを使用することができます。また、カスタムビューを読み込む際に大きなオーバーヘッドがない場合でも、可視性だけで同じことを行うことができます。

<?xml version="1.0" encoding="utf-8"?> 
<layout xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:app="http://schemas.android.com/apk/res-auto"> 
    <data> 
     <import type="android.view.View"/> 
     <variable name="user" type="com.example.User"/> 
     <variable name="viewChoice" type="int"/> 
    </data> 
    <FrameLayout ...> 
     <!-- All of your outer layout, which may include binding 
      to the user variable --> 
     <ViewStub android:layout="@layout/myCustomView1" 
       app:user="@{user}" 
       android:visiblity="@{viewChoice == 1} ? View.VISIBLE : View.GONE"/> 
     <ViewStub android:layout="@layout/myCustomView2" 
       app:user="@{user}" 
       android:visiblity="@{viewChoice == 2} ? View.VISIBLE : View.GONE"/> 
    </FrameLayout> 
</layout> 
+0

恐ろしい!ありがとうジョージ。あなたが言った解決策は私の要求を満たすのに十分だと思います。 – androholic

関連する問題