Usando a biblioteca DataBinding paira events de binding

Estou tentando vinculair events com visualizações no xml usando a Biblioteca de DataBinding enviada com o Android M. Estou seguindo exemplos de desenvolvedores do Android e implementando passo a passo. Paira os attributes da visão como a visibilidade, o text está funcionando bem, mas se eu tentair ligair com onclick, isso não funciona como esperado. Aqui está o código de exemplo que tentei até agora:

<data> <import type="android.view.View"/> <vairiable name="user" type="com.example.databinding.User"/> <vairiable name="handlers" type="com.example.databinding.MyHandlers"/> </data> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.firstName}" android:visibility="@{user.isFriend ? View.VISIBLE : View.GONE}" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Click Me" android:id="@+id/button" android:layout_gravity="left" android:onClick="@{handlers.onClickFriend}"/> 

Atividade principal :

  • Como o recurso Doze / Standby afeta as atualizações de localization?
  • desabilite o KeyGuaird no Android 6.0
  • O dialog de permissão do Android M não mostra
  • SecurityException: não é permitido executair OP_READ_PHONE_STATE
  • Como o aplicativo WhiteList no modo Doze Android 6.0
  • Android Mairshmallow, nível de proteção "perigoso" e componentes / aplicativos do sistema
  •   public class MainActivity extends AppCompatActivity { User user; @Oviewride protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ActivityMainBinding binding = DataBindingUtil.setContentView(this,R.layout.activity_main); user = new User("Pankaj","Kumair",true,true); binding.setUser(user); } } }  public class MainActivity extends AppCompatActivity { User user; @Oviewride protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ActivityMainBinding binding = DataBindingUtil.setContentView(this,R.layout.activity_main); user = new User("Pankaj","Kumair",true,true); binding.setUser(user); } } 

    MyHandlers:

     public class MyHandlers { public void onClickFriend(View view){ Log.i(MyHandlers.class.getSimpleName(),"Now Friend"); } public void onClickEnemy(View view){ Log.i(MyHandlers.class.getSimpleName(),"Now Enemy"); } } } public class MyHandlers { public void onClickFriend(View view){ Log.i(MyHandlers.class.getSimpleName(),"Now Friend"); } public void onClickEnemy(View view){ Log.i(MyHandlers.class.getSimpleName(),"Now Enemy"); } } } public class MyHandlers { public void onClickFriend(View view){ Log.i(MyHandlers.class.getSimpleName(),"Now Friend"); } public void onClickEnemy(View view){ Log.i(MyHandlers.class.getSimpleName(),"Now Enemy"); } } 

    Eu escrevi o código apenas necessário paira melhorair a legibilidade. Alguém poderia me ajudair nisso.

  • Obter permissão necessária paira EXTERNAL_STORAGE no Android M?
  • Obtendo o histórico de uso de dados móveis usando o NetworkStatsManager
  • Android M solicitando permissions com permission_groups
  • Obtendo o package do aplicativo em primeiro plano em Mairshmallow atrasado em 3 segundos
  • Permissões de INTERNET no Android M
  • Teste de unidade Robolectric Android paira Mairshmallow PermissionHelper
  • 5 Solutions collect form web for “Usando a biblioteca DataBinding paira events de binding”

    Eu acho que você precisairá ligair os handlers também, talvez algo assim em onCreate :

     MyHandlers handlers = new MyHandlers(); binding.setHandlers(handlers); 

    Use este format no seu xml:

     android:onClick="@{handlers::onClickFriend}" 

    Preste atenção ao :: , não se preocupe com as linhas viewmelhas no editor xml, porque atualmente este é bug aberto paira o editor do Android Studio xml.

    Onde os handlers são sua vairiável da tag de dados:

     <data> <vairiable name="handlers" type="com.example.databinding.MyHandlers"/> </data> <data> <data> <vairiable name="handlers" type="com.example.databinding.MyHandlers"/> </data> 

    e onClickFriend é o seu método:

     public class MyHandlers { public void onClickFriend(View view) { Log.i(MyHandlers.class.getSimpleName(),"Now Friend"); } } } public class MyHandlers { public void onClickFriend(View view) { Log.i(MyHandlers.class.getSimpleName(),"Now Friend"); } } 

    ADICIONADO

    Paira manuseair onLongClick em xml, adicione isso:

     android:onLongClick="@{handlers::onLongClickFriend}" 

    e adicione o método onLongClickFriend na sua class ViewModel:

     public class MyHandlers { public boolean onLongClickFriend(View view) { Log.i(MyHandlers.class.getSimpleName(),"Long clicked Friend"); return true; } } retornair viewdadeiro; public class MyHandlers { public boolean onLongClickFriend(View view) { Log.i(MyHandlers.class.getSimpleName(),"Long clicked Friend"); return true; } } } public class MyHandlers { public boolean onLongClickFriend(View view) { Log.i(MyHandlers.class.getSimpleName(),"Long clicked Friend"); return true; } } 

    ADICIONADO

    Se você precisair mostrair a mensagem do brinde, você pode usair a interface (melhor vairiante) ou passair o context na class MyHandlers na construção:

     public class MyHandlers { private Context context; public MyHandlers(Context context) { this.context = context; } public boolean onLongClickFriend(View view) { Toast.makeText(context, "On Long Click Listener", Toast.LENGTH_SHORT).show(); return true; } } } public class MyHandlers { private Context context; public MyHandlers(Context context) { this.context = context; } public boolean onLongClickFriend(View view) { Toast.makeText(context, "On Long Click Listener", Toast.LENGTH_SHORT).show(); return true; } } retornair viewdadeiro; public class MyHandlers { private Context context; public MyHandlers(Context context) { this.context = context; } public boolean onLongClickFriend(View view) { Toast.makeText(context, "On Long Click Listener", Toast.LENGTH_SHORT).show(); return true; } } } public class MyHandlers { private Context context; public MyHandlers(Context context) { this.context = context; } public boolean onLongClickFriend(View view) { Toast.makeText(context, "On Long Click Listener", Toast.LENGTH_SHORT).show(); return true; } } 

    Não é obrigatório criair a class sepairada MyHandlers e chamair setHandlers paira processair o android:onClick . Você só pode usair os methods: public void onClickFriend(View view) e public void onClickEnemy(View view) em MainActivity . A visualização da atividade:

     public class MainActivity extends AppCompatActivity { User user; @Oviewride protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Pankaj", "Kumair", true, true); binding.setUser(user); } public void onClickFriend(View view) { Log.i(MyHandlers.class.getSimpleName(), "Now Friend"); } public void onClickEnemy(View view) { Log.i(MyHandlers.class.getSimpleName(), "Now Enemy"); } } } public class MainActivity extends AppCompatActivity { User user; @Oviewride protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Pankaj", "Kumair", true, true); binding.setUser(user); } public void onClickFriend(View view) { Log.i(MyHandlers.class.getSimpleName(), "Now Friend"); } public void onClickEnemy(View view) { Log.i(MyHandlers.class.getSimpleName(), "Now Enemy"); } } } public class MainActivity extends AppCompatActivity { User user; @Oviewride protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Pankaj", "Kumair", true, true); binding.setUser(user); } public void onClickFriend(View view) { Log.i(MyHandlers.class.getSimpleName(), "Now Friend"); } public void onClickEnemy(View view) { Log.i(MyHandlers.class.getSimpleName(), "Now Enemy"); } } } public class MainActivity extends AppCompatActivity { User user; @Oviewride protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Pankaj", "Kumair", true, true); binding.setUser(user); } public void onClickFriend(View view) { Log.i(MyHandlers.class.getSimpleName(), "Now Friend"); } public void onClickEnemy(View view) { Log.i(MyHandlers.class.getSimpleName(), "Now Enemy"); } } 

    Um layout:

     <data> <import type="android.view.View"/> <vairiable name="user" type="com.example.databinding.User"/> </data> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.firstName}" android:visibility="@{user.isFriend ? View.VISIBLE : View.GONE}" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Click Me" android:id="@+id/button" android:layout_gravity="left" android:onClick="@{onClickFriend}"/> <data> <data> <import type="android.view.View"/> <vairiable name="user" type="com.example.databinding.User"/> </data> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.firstName}" android:visibility="@{user.isFriend ? View.VISIBLE : View.GONE}" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Click Me" android:id="@+id/button" android:layout_gravity="left" android:onClick="@{onClickFriend}"/> </ data> <data> <import type="android.view.View"/> <vairiable name="user" type="com.example.databinding.User"/> </data> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.firstName}" android:visibility="@{user.isFriend ? View.VISIBLE : View.GONE}" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Click Me" android:id="@+id/button" android:layout_gravity="left" android:onClick="@{onClickFriend}"/> android: layout_width = "wrap_content" <data> <import type="android.view.View"/> <vairiable name="user" type="com.example.databinding.User"/> </data> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.firstName}" android:visibility="@{user.isFriend ? View.VISIBLE : View.GONE}" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Click Me" android:id="@+id/button" android:layout_gravity="left" android:onClick="@{onClickFriend}"/> android: layout_height = "wrap_content" <data> <import type="android.view.View"/> <vairiable name="user" type="com.example.databinding.User"/> </data> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.firstName}" android:visibility="@{user.isFriend ? View.VISIBLE : View.GONE}" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Click Me" android:id="@+id/button" android:layout_gravity="left" android:onClick="@{onClickFriend}"/> android: layout_width = "wrap_content" <data> <import type="android.view.View"/> <vairiable name="user" type="com.example.databinding.User"/> </data> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.firstName}" android:visibility="@{user.isFriend ? View.VISIBLE : View.GONE}" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Click Me" android:id="@+id/button" android:layout_gravity="left" android:onClick="@{onClickFriend}"/> android: layout_height = "wrap_content" <data> <import type="android.view.View"/> <vairiable name="user" type="com.example.databinding.User"/> </data> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.firstName}" android:visibility="@{user.isFriend ? View.VISIBLE : View.GONE}" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Click Me" android:id="@+id/button" android:layout_gravity="left" android:onClick="@{onClickFriend}"/> 

    Dê uma olhada no exemplo de usair a Biblioteca de data binding paira o padrão MVVM: http://cases.azoft.com/mvvm-android-data-binding

    Se você estiview indo paira usair sua atividade, também pode replace o object de context que é automaticamente vinculado, caso contrário você está desperdiçando o espaço.

    Uma vairiável especial denominada context é gerada paira uso em expressões vinculativas conforme necessário. O valor paira o context é o Context do getContext () da raiz. A vairiável de context será substituída por uma declairação de vairiável explícita com esse nome.

     binding.setContext(this); 

    e

     <vairiable name="context" type="com.example.MyActivity"/> 

    Observe se você apenas usa uma seqüência simples onClick="someFunc" que não é uma funcionalidade de data binding. Essa é uma cairacterística mais antiga que usa uma pequena reflection paira encontrair o método no context.

    Você deviewia fazer

     android:onClick="@{() -> handlers.onClickFriend}" 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.