使用数据绑定库事件绑定

问题描述 投票:40回答:8

我试图绑定使用附带的Android M.我下面从Android Developers实例和实现步骤一步的数据绑定库视图XML事件。该视图的知名度一样,文本属性其工作正常,但如果我尝试使用的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}"/>

我的C-TY奇韦:

  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);
   }
 }

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");
  }
}

我只写所需的代码以提高可读性。可能有人帮我在这。

android data-binding android-6.0-marshmallow android-databinding
8个回答
94
投票

我认为你需要将handlers结合为好,也许这样的事情在onCreate

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

21
投票

设置点击很多方法

1)通处理程序来结合。

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

2)设置的点击次数(使用任何的下面)

android:onClick="@{handler::onClickMethodReference}"

要么

android:onClick="@{handler.onClickMethodReference}"

要么

android:onClick="@{() -> handler.onClickLamda()}"

要么

android:onClick="@{(v) -> handler.onClickLamdaWithView(v)}"

要么

android:onClick="@{() -> handler.onClickLamdaWithView(model)}"

见Handler类的理解。

public class Handler {
    public void onClickMethodReference(View view) {
        //
    }
    public void onClickLamda() {
        //
    }
    public void onClickLamdaWithView(View view) {
        //
    }
    public void onClickLamdaWithObject(Model model) {
        //
    }
}

注意

  • 您可以使用方法参考(::)当你有相同的参数作为属性的onClick。
  • 你可以通过像onClickLamdaWithObject例如任何对象。
  • 如果你需要传递View对象就用(v)->表达。

延伸阅读

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


14
投票

使用在你的XML格式如下:

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

注意::,不用担心在XML编辑器中的红线,因为目前这是开放bug为Android Studio的XML编辑器。

其中handlers是从数据标签的变量:

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

onClickFriend是你的方法:

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

添加

对于手柄onLongClick在XML中添加此:

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

在您的视图模型类添加onLongClickFriend方法:

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

添加

如果您需要显示敬酒消息,你可以使用接口(更好的方法),或在建设中的context类通过MyHandlers

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;
    }
}

4
投票

如果你要使用你的活动,不妨更换自动绑定的context对象,否则你就浪费了空间。

用于生成按需要绑定表达式命名上下文中的特殊变量。上下文的值是从根视图的的getContext()的上下文。上下文变量将通过与该名称的显式变量声明被覆盖。

binding.setContext(this);

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

注意:如果你只是用普通字符串onClick="someFunc"这不是一个绑定的功能都没有。这是一个使用小反射找到上下文的方法的旧款功能。


4
投票

你应该做

android:onClick="@{() -> handlers.onClickFriend()}"

3
投票

我张贴这只是为了掩饰两种方式来实现这一目标。 1.监听通过法refernce结合2.

布局:

<layout...>
<data>

        <variable
            name="handlers"
            type="com.example.databinding.MyPresenter" />
        <variable name="user" type="com.example.databinding.User"/>
</data>

<LinearLayout
  android:layout_width="wrap_content"
  android:layout_height="wrap_content">

    <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="32dp"
            android:text="Using Listener Binding"
            android:onClick="@{() -> handlers.onLisClick(user)}"/>

     <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="32dp"
            android:text="Using Method Ref"
            android:onClick="@{handlers::onButtonClicked}"/>            

</LinearLayout>
</layout>

活动:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ActivityMainBinding binding =
                DataBindingUtil.setContentView(this, R.layout.activity_main);
        MyPresenter presenter = new MyPresenter();
        User user = new User("Alex","RJ")
        binding.setUser(user);
        binding.setHandlers(presenter);
    }

MyPresenter:

public class MyPresenter{

//using listener binding
public void onLisClick(User user){
//do something..
}


//using method reference
public void onButtonClicked(View view){

// do something
}

}

注意: 1.当使用方法的参考方法签名应该是一样的,你会写任何其他的onClick的方法,即公众和查看参数。

2.当使用监听器绑定你,如果你想和做任何操作就可以直接传递对象也大有裨益。


2
投票

它不是强制性的创建单独的类MyHandlers和呼叫setHandlers处理android:onClick。你可以只使用方法:在public void onClickFriend(View view) public void onClickEnemy(View view)MainActivity。活动视图:

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);
    }

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

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

布局:

<data>
    <import type="android.view.View"/>
    <variable 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}"/>

看看使用MVVM模式的数据绑定图书馆的例子:http://cases.azoft.com/mvvm-android-data-binding


1
投票

我张贴这一点,因为我有一个其他的情况,即发生这种情况。如果你有两个活动引用到布局文件和一个定义onclick事件,另一种则你不会得到在您定义的事件活动相同的警告和奇怪的。

要检查此,我建议通过布局名称,然后按right clicking find references找到布局文件的用途。不要忘了重建应用程序后记。

© www.soinside.com 2019 - 2024. All rights reserved.