通过数据绑定替换 xml 标记中的 onClick 事件

Replacement for onClick event in xml tag via Databinding

我的问题很简单,但我似乎做不到我想做的。

所以在我的 activity 我有这个方法。

 public void performButtonClick(View view)
 {
        Log.i("INTRO", "OK");
 }

这是从 xml 中定义的按钮单击事件调用的,就像这样

 <Button

               android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:onClick="performButtonClick"
                android:text="@string/start"/>

现在我听说这种方法使用反射会降低性能,所以我试图用数据绑定替换 onClick 事件。

我尝试了各种组合,例如

android:onClick="@{performButtonClick}"

 android:onClick="@{(v) -> performButtonClick(v)}"

android:onClick="@{(v) -> MainActivity::performButtonClick}"

但其中 None 有效。
你能帮帮我吗?

好的回答我自己的问题。

我是 DataBinding 的新手,但我不明白为什么我必须使用复制粘贴的解决方案,这些解决方案利用了附件 Handlers class 并最终得到比我使用的更多的样板代码有。

我想要的只是等同于 android:onClick="performButtonClick" 所以这是我的解决方案:

activity_main.xml

<layout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto">

    <data>

        <variable
            name="activity"
            type="com.example.mydatabinding.MainActivity"/>
    </data>

<LinearLayout
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@drawable/bg"
        android:orientation="vertical">

<Button
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:onClick="@{activity::performButtonClick}"
                android:text="@string/start"/>
</LinearLayout>

MainActivity.java

public final class MainActivity extends AppCompatActivity
{
    ActivityMainBinding binding;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
        binding.setActivity(this);
    }

    public void performButtonClick(View view)
    {
        Log.i("INTRO", "OK");
    }
}