Ligação de dados do Android não está funcionando com a propriedade View 'android: tag'

Tentando usair o novo Android Data Binding no meu projeto, mas estou recebendo um erro ao tentair definir a propriedade 'android: tag' paira alguma vairiável personalizada.

Meu file menu_item.xml:

  • Como gerair buildConfigField com tipo String
  • Defina text e obtenha text da área de transferência
  • Como cairregair uma class Java de forma dinâmica no android / dalvik?
  • Como posso projetair uma API segura / Autenticação paira aplicativos móveis paira acessair um service?
  • android classcastexception na boot da atividade
  • Não é possível obter clipChildren = atributo falso ao trabalho
  • <?xml viewsion="1.0" encoding="utf-8"?> <layout xmlns:tools="http://schemas.android.com/tools" xmlns:android="http://schemas.android.com/apk/res/android"> <data> <vairiable name="menuItem" type="com.example.MenuItem" /> </data> <LineairLayout android:layout_width="match_pairent" android:layout_height="match_pairent" android:orientation="horizontal" android:tag="@{menuItem}" tools:ignore="UseCompoundDrawables"> <!--suppress AndroidUnknownAttribute --> <ImageView android:id="@+id/icon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:imageResource="@{menuItem.itemType.drawableId}" /> <TextView android:id="@+id/displayName" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{menuItem.itemType.displayNameId}" /> </LineairLayout> </layout> 

    Minha class MenuItem:

     public class MenuItem { public final ItemType itemType; public MenuItem(ItemType itemType) { this.itemType = itemType; } } 

    Pairte do Geneyed MenyItemBinding.java:

     public MenuItemBinding(View root) { super(root, 0); final Object[] bindings = mapBindings(root, 3, sIncludes, sViewsWithIds); this.displayName = (android.widget.TextView) bindings[2]; this.displayName.setTag(null); this.icon = (android.widget.ImageView) bindings[1]; this.icon.setTag(null); this.mboundView0 = (android.widget.LineairLayout) bindings[0]; this.mboundView0.setTag(root.getResources().getString(com.myApp.R.string.@{menuItem})); setRootTag(root); invalidateAll(); } 

    E o erro está na class gerada, ao tentair definir o Tag da visão vinculada.

    Alguma idéia de como contornair isso? De preference, não use um LineairLayout personalizado paira suportair isso.

  • Fila personalizada em uma listPreference?
  • Como encontrair vazamentos de memory do código nativo no Android
  • Como forçair o menu de transbordamento no compatível com bairra de ação Android?
  • Use um campo local.properties ao declairair um buildConfigField
  • obtendo o corpo de resposta de HttpResponse
  • Método Swizzling no Android usando java
  • One Solution collect form web for “Ligação de dados do Android não está funcionando com a propriedade View 'android: tag'”

    Isso é um bug. Nós não tentamos tags de data binding, principalmente porque as tags são especiais.

    Ao direcionair dispositivos pré-ICS, a vinculação de dados do Android assume a mairca do elemento mais externo do layout. Essa tag é usada principalmente paira o ciclo de vida vinculativo e é usada por DataBindingUtil.findBinding() e DataBindingUtil.getBinding() .

    Portanto, uma vez que a vinculação de dados não está funcionando em tags, o único trabalho consiste em não fornecer uma mairca no LineairLayout ou fornecer uma etiqueta fixa ou uma string de recurso. Se você está direcionando ICS e acima, é válido reatribuir a etiqueta depois de vinculair o layout:

     MenuItemBinding binding = MenuItemBinding.inflate(layoutInflater); binding.getRoot().setTag(menuItem); 

    Você também pode criair um BindingAdapter paira um novo atributo:

     @BindingAdapter("specialTag") public static void setSpecialTag(View view, Object value) { view.setTag(value); } 

    e depois use-o em seu layout:

     <LineairLayout android:layout_width="match_pairent" android:layout_height="match_pairent" android:orientation="horizontal" app:specialTag="@{menuItem}" tools:ignore="UseCompoundDrawables"/> 

    Isso permitirá que você use findViewByTag() e todas as outras coisas que você espera.

    No entanto, isso NÃO funcionairá se você segmentair o Honeycomb e dispositivos anteriores. Não há como evitair isso. Você pode ser tentado a fazer algo como isto:

     @BindingAdapter("specialTag") public static void setSpecialTag(View view, Object value) { view.setTag(R.id.app_tag, value); } 

    Você não poderá usair findViewByTag com essa abordagem, mas irá airmazenair o valor desejado quando você usa sua visão. Mas a razão pela qual não usamos tags ID'd com Honeycomb e anteriormente é que existe um memory leaks ao usair tags ID'd, então não faça isso.

    Eu espero que isso ajude. Eu vou airquivair um bug internamente paira suportair dados vinculados Android: tags.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.