2017-02-23 18 views
0

フィールドがサーバーリターンによって設定されたフォームがあります。動的に作成されたフィールドにAndroidで双方向データバインディングを使用する方法

これはアクティビティのコードです。

//returned by server 
String[] attributes = new String[] {"occupation", "salary", "age"}; 

LinearLayout dynamicLayout = (LinearLayout) findViewById(R.id.dynamic_layout); 
for (String attribute : attributes) { 
    EditText text = new EditText(this); 
    text.setLayoutParams(new LayoutParams(
     LayoutParams.WRAP_CONTENT, 
     LayoutParams.WRAP_CONTENT 
    )); 
    text.setText(attribute); 
    dynamicLayout.addView(text); 
} 

私は、このモデルクラスに

私は上記の属性は、私が作成しようとしている EditText

に属性名と値の入力間のマップが含まれていることを期待最後に

class Person { 
    public Map<String, String> attributes; 
} 

を持っていますレイアウトファイルで事前に定義されているEditTextを使用する双方向データバインディングサンプル。しかし、私はこの動的な属性ができるかどうか疑問に思っています。

答えて

2

データバインディングは、コード生成レイアウトでは実際には機能しません。つまり、データバインディングを使用してバインディングアダプタでこれを行うことができます。

この記事では、リストをデータバインディングを使用する方法を説明します:

https://medium.com/google-developers/android-data-binding-list-tricks-ef3d5630555e#.v2deebpgv

あなたの代わりに、リストの配列を使用したい場合は、それが小さな調整です。マップを使用する場合は、マップをパラメータとしてバインドされたレイアウトに渡す必要があります。この記事では、単一の変数を想定していますが、BindingAdapterで複数の変数を渡すことはできます。単純な結合アダプタの場合:

@BindingAdapter({"entries", "layout", "extra"}) 
public static <T, V> void setEntries(ViewGroup viewGroup, 
            T[] entries, int layoutId, 
            Object extra) { 
    viewGroup.removeAllViews(); 
    if (entries != null) { 
     LayoutInflater inflater = (LayoutInflater) 
      viewGroup.getContext()  
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     for (int i = 0; i < entries.length; i++) { 
      T entry = entries[i]; 
      ViewDataBinding binding = DataBindingUtil 
       .inflate(inflater, layoutId, viewGroup, true); 
      binding.setVariable(BR.data, entry); 
      binding.setVariable(BR.extra, extra); 
     } 
    } 
} 

そして、あなたは、このようなエントリを結合する:(entry.xmlを想定)

<layout> 
    <data> 
     <variable name="data" type="String"/> 
     <variable name="extra" type="java.util.Map&lt;String, String&gt;"/> 
    </data> 
    <EditText xmlns:android="..." 
     android:text="@={extra[data]}" 
     .../> 
</layout> 

そして、あなた含むレイアウトで、あなたが使用したい:

<layout> 
    <data> 
     <variable name="person" type="com.example.Person"/> 
     <variable name="attributes" type="String[]"/> 
    </data> 
    <FrameLayout xmlns:android="..." xmlns:app="..."> 
     <!-- ... --> 
     <LinearLayout ... 
      app:layout="@{@layout/entry}" 
      app:entries="@{attributes}" 
      app:extra="@{person.attributes}"/> 
    </FrameLayout> 
</layout> 
関連する問題