使用DataBinding库绑定事件

Pan*_*kaj 44 data-binding android android-databinding android-6.0-marshmallow

我正在尝试使用Android M附带的DataBinding Library将事件与xml中的视图绑定.我正在关注Android开发人员的示例并逐步实现.对于视图的属性,如可见性,文本工作正常,但如果我尝试与onclick绑定,它不会按预期工作.这是我到目前为止尝试过的示例代码:

 <data>
    <import type="android.view.View"/>
    <variable name="user" type="com.example.databinding.User"/>
    <variable 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}"/>
Run Code Online (Sandbox Code Playgroud)

主要活动 :

  public class MainActivity extends AppCompatActivity {

  User user;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ActivityMainBinding binding = 
    DataBindingUtil.setContentView(this,R.layout.activity_main);
    user = new User("Pankaj","Kumar",true,true);
    binding.setUser(user);
   }
 }
Run Code Online (Sandbox Code Playgroud)

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");
  }
}
Run Code Online (Sandbox Code Playgroud)

我只编写了必需的代码来提高可读性.有人可以帮我这个.

Min*_*tdh 96

我想你也需要绑定它handlers,也许是这样的onCreate:

MyHandlers handlers = new MyHandlers();
binding.setHandlers(handlers);
Run Code Online (Sandbox Code Playgroud)

  • 是的,如果你使用Activity类作为处理程序,那么你只需要这样做:`binding.setHandlers(this);` (9认同)
  • @dorsz +100 给你!我找了几个小时! (2认同)
  • 这很棒!我希望文档能够更好地概述这一点!谢谢你的答案! (2认同)

Khe*_*raj 27

多种设置方式请点击

1)将处理程序传递给绑定。

ActivityMainBinding binding = DataBindingUtil.setContentView(this,R.layout.activity_main);
Hander handler = new Handler();
binding.setHandlers(handlers);
Run Code Online (Sandbox Code Playgroud)

2)设置点击次数(使用以下任一选项)

android:onClick="@{handler::onClickMethodReference}"
Run Code Online (Sandbox Code Playgroud)

要么

android:onClick="@{handler.onClickMethodReference}"
Run Code Online (Sandbox Code Playgroud)

要么

android:onClick="@{() -> handler.onClickLamda()}"
Run Code Online (Sandbox Code Playgroud)

要么

android:onClick="@{(v) -> handler.onClickLamdaWithView(v)}"
Run Code Online (Sandbox Code Playgroud)

要么

android:onClick="@{() -> handler.onClickLamdaWithView(model)}"
Run Code Online (Sandbox Code Playgroud)

请参阅Handler类以进行了解。

public class Handler {
    public void onClickMethodReference(View view) {
        //
    }
    public void onClickLamda() {
        //
    }
    public void onClickLamdaWithView(View view) {
        //
    }
    public void onClickLamdaWithObject(Model model) {
        //
    }
}
Run Code Online (Sandbox Code Playgroud)

注意

  • 当您具有与属性onClick相同的参数时,可以使用方法参考(::)
  • 您可以像onClickLamdaWithObject示例一样传递任何对象。
  • 如果您需要传递View对象,则只需使用(v)->表达式。

进一步阅读

https://developer.android.com/topic/libraries/data-binding/expressions


wal*_*kmn 14

在xml中使用以下格式:

android:onClick="@{handlers::onClickFriend}"
Run Code Online (Sandbox Code Playgroud)

注意::,不要担心xml编辑器中的红线,因为目前这是Android Studio xml编辑器的开放bug.

handlers从数据标签的变量:

<data>
    <variable name="handlers" type="com.example.databinding.MyHandlers"/>
</data>
Run Code Online (Sandbox Code Playgroud)

并且onClickFriend是你的方法:

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

添加

对于onLongClickxml中的句柄添加:

android:onLongClick="@{handlers::onLongClickFriend}"
Run Code Online (Sandbox Code Playgroud)

onLongClickFriend在ViewModel类中添加方法:

public class MyHandlers {
    public boolean onLongClickFriend(View view) {
        Log.i(MyHandlers.class.getSimpleName(),"Long clicked Friend");
        return true;
    }
}
Run Code Online (Sandbox Code Playgroud)

添加

如果您需要显示敬酒消息,你可以使用接口(更好的方法),或通过contextMyHandlers建筑类:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)