首页 > 解决方案 > 在包含的布局中调用 onClick() 时出错

问题描述

我是数据绑定的新手。当我尝试从 viewModel 调用方法时,我不断收到这个特定错误, Found data binding errors. ****/ data binding error ****msg:Cannot find the proper callback class for android:onClick. Tried android.view.View but it has 0 abstract methods, should have 1 abstract methods. file:C:\Projects\myapp\app\src\main\res\layout\content_details.xml loc:73:27 - 73:69 ****\ data binding error **** 我已经从 xml 和活动中解析了“viewModel”变量。它只是行不通。该方法可以从 activity_details.xml 中的文本视图调用,它是包含布局的父级。它完美地工作。该错误仅来自包含的布局。我尝试了其他解决方案,这些解决方案对我不起作用。知道如何解决这个问题吗?

include_layout.xml

  `  
<?xml version="1.0" encoding="utf-8"?>
<layout >
    <data>
        <variable
            name="viewModel"
            type="com.daniel.user.viewmodels.ItemDetailsViewModel"/>
    </data>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:layout_marginTop="@dimen/margin_medium"
    android:layout_marginBottom="@dimen/margin_medium"
    >
....
 <com.varunest.sparkbutton.SparkButton
        android:id="@+id/favBtn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/imageScrollView"
        android:layout_alignParentEnd="true"
        app:sparkbutton_activeImage="@drawable/heart"
        app:sparkbutton_iconSize="30dp"
        app:sparkbutton_inActiveImage="@drawable/ic_home_white_24dp"
        app:sparkbutton_primaryColor="@color/colorPrimary"
        app:sparkbutton_secondaryColor="@color/colorAccent"
        android:onClick="@{() -> viewModel.updateItemFavouriteStatus()}"
        />
.....
</RelativeLayout>
</layout> `   

这是我的视图模型。

   `    
    public class ItemDetailsViewModel extends BaseViewModel {
        public MutableLiveData<ErrorVO> errorVOMutableLiveData = new MutableLiveData<>();
        public void updateItemFavouriteStatus() {
            errorVOMutableLiveData.setValue(new ErrorVO("Clicked gg", 0));
        }
    }    
    `

这是我的活动。

`
  @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = DataBindingUtil.setContentView(this,R.layout.activity_details);
        ButterKnife.bind(this);
        viewModel = ViewModelProviders.of(this).get(ItemDetailsViewModel.class);
        binding.contentDetails.setVariable(BR.viewModel,viewModel);
        binding.setViewModel(viewModel);
}
   ` 

标签: androiddata-binding

解决方案


问题是您没有将参数 (View v) 放在 updateItemFavouriteStatus 方法上:

public void updateItemFavouriteStatus(View v) {}

推荐阅读