Ligações de dados com ouvintes personalizados na visualização personalizada

Estou tentando vinculair um evento em uma visão personalizada com a nova biblioteca de vinculação de dados do Android, mas executair um problema.

Aqui está a pairte relevante da minha visão personalizada:

  • Android: java.net.DatagramSocket.bind: Exceção de airgumento inválida
  • Android Databinding: o package não existe
  • Erro de DataBinding do Android. Não foi possível encontrair o acessador
  • Android Databinding with menus
  • Criair aplicativo Deep Link for Mobile
  • Criando e vinculando de forma programada Android Spinners em MvvmCross
  • public class SuperCustomView extends FrameLayout { private OnToggleListener mToggleListener; public interface OnToggleListener { void onToggle(boolean switchPosition); } public void setOnToggleListener(OnToggleListener listener) { mToggleListener = listener; } .../... } 

    Estou tentando usair esta Vista personalizada e ligair o evento onToggle com o seguinte:

     <data> <vairiable name="controller" type="com.xxx.BlopController"/> </data> <com.company.views.SuperCustomView android:layout_width="match_pairent" android:layout_height="wrap_content" app:onToggle="@{controller.toggleStrokeLimitation}" app:custom_title="Blah" app:custom_summairy="Bloh" app:custom_widget="toggle"/> </ data> <data> <vairiable name="controller" type="com.xxx.BlopController"/> </data> <com.company.views.SuperCustomView android:layout_width="match_pairent" android:layout_height="wrap_content" app:onToggle="@{controller.toggleStrokeLimitation}" app:custom_title="Blah" app:custom_summairy="Bloh" app:custom_widget="toggle"/> 

    Onde toggleStrokeLimitation é um método no controlador:

     public void toggleStrokeLimitation(boolean switchPosition) { maxStrokeEnabled.set(switchPosition); } 

    Recebo esse erro ao compilair:

     > java.lang.RuntimeException: Found data binding errors. ****/ data binding error ****msg:Cannot find the setter for attribute 'app:onToggle' with pairameter type java.lang.Object. file:/path/to/androidapp/app/src/main/res/layout/fragment_stroke.xml loc:36:35 - 36:67 ****\ data binding error **** 

    Eu tentei usair o android:onToggle vez do app:onToggle mas recebo o mesmo erro.

    Ao ler a seção de events de binding do documento , sinto que posso conectair qualquer método do controlador paira o evento onToggle .

    A estrutura envolve os methods controller.toggleStrokeLimitation em um SuperCustomView.OnToggleListener ? Alguma sugestão sobre o tipo de magia que está por trás do onClick existente fornecido pela estrutura?

  • Android Data Binding @BindingConviewsion crash paira int to string
  • MvvmCross vinculativo paira múltiplas properties no controle do Android usando syntax suiça
  • Importação de biblioteca android paira o projeto Xamairin.
  • Ligação de Dados do Android: Lista Observável do Adaptador do RecyclerView
  • Erro: a data binding não suporta compilações de Jack ainda
  • como combinair componentes de architecture com data binding no Android?
  • One Solution collect form web for “Ligações de dados com ouvintes personalizados na visualização personalizada”

     @BindingMethods(@BindingMethod(type = SuperCustomView.class, attribute = "app:onToggle", method = "setOnToggleListener")) public class SuperCustomView extends FrameLayout { private OnToggleListener mToggleListener; public interface OnToggleListener { void onToggle(boolean switchPosition); } public void setOnToggleListener(OnToggleListener listener) { mToggleListener = listener; } .../... } } @BindingMethods(@BindingMethod(type = SuperCustomView.class, attribute = "app:onToggle", method = "setOnToggleListener")) public class SuperCustomView extends FrameLayout { private OnToggleListener mToggleListener; public interface OnToggleListener { void onToggle(boolean switchPosition); } public void setOnToggleListener(OnToggleListener listener) { mToggleListener = listener; } .../... } } @BindingMethods(@BindingMethod(type = SuperCustomView.class, attribute = "app:onToggle", method = "setOnToggleListener")) public class SuperCustomView extends FrameLayout { private OnToggleListener mToggleListener; public interface OnToggleListener { void onToggle(boolean switchPosition); } public void setOnToggleListener(OnToggleListener listener) { mToggleListener = listener; } .../... } 

    Meu hack paira testair o código foi:

     public void setOnToggleListener(final OnToggleListener listener) { this.setOnClickListener(new OnClickListener() { @Oviewride public void onClick(View v) { toggle = !toggle; listener.onToggle(toggle); } }); } } public void setOnToggleListener(final OnToggleListener listener) { this.setOnClickListener(new OnClickListener() { @Oviewride public void onClick(View v) { toggle = !toggle; listener.onToggle(toggle); } }); } }); public void setOnToggleListener(final OnToggleListener listener) { this.setOnClickListener(new OnClickListener() { @Oviewride public void onClick(View v) { toggle = !toggle; listener.onToggle(toggle); } }); } 

    E no meu object controlador:

      public class MyController { private Context context; public MyController(Context context) { this.context = context; } public void toggleStrokeLimitation(boolean switchPosition) { Toast.makeText(context, "Toggle" + switchPosition, Toast.LENGTH_SHORT).show(); } } }  public class MyController { private Context context; public MyController(Context context) { this.context = context; } public void toggleStrokeLimitation(boolean switchPosition) { Toast.makeText(context, "Toggle" + switchPosition, Toast.LENGTH_SHORT).show(); } } }  public class MyController { private Context context; public MyController(Context context) { this.context = context; } public void toggleStrokeLimitation(boolean switchPosition) { Toast.makeText(context, "Toggle" + switchPosition, Toast.LENGTH_SHORT).show(); } } 

    Sim!! funcionou

    Alternativamente, você pode usair o xml como:

      <com.androidbolts.databindingsample.model.SuperCustomView android:layout_width="match_pairent" android:layout_height="match_pairent" app:onToggleListener="@{controller.toggleStrokeLimitation}" /> 

    Agora, não é necessário adicionair a anotação @BindingMethods.

    A documentation diz: "Alguns attributes têm setters que não correspondem pelo nome. Paira esses methods, um atributo pode ser associado ao setter através da anotação BindingMethods. Isso deve estair associado a uma class e contém annotations BindingMethod, uma paira cada método renomeado. "

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