[英]Not able to make click event in android data binding
View.Java
package com.espresso.mvvmtestproject;
import android.content.Context;
import android.databinding.DataBindingUtil;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import com.espresso.mvvmtestproject.databinding.ActivityMainBinding;
public class View extends AppCompatActivity implements ViewContract.requiredMethods{
ViewModel mModel;
ActivityMainBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//Setting the layout
binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
mModel=new ViewModel(getContext());
binding.setUser(mModel);
binding.setHandlers(new MyHandlers());
}
@Override
public void onDestroy() {
super.onDestroy();
}
@Override
public Context getContext() {
return View.this;
}
}
ViewContract.java
public interface ViewContract {
interface requiredMethods{
Context getContext();
}
}
activity_main.xml中
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="user"
type="com.espresso.mvvmtestproject.ViewModel"/>
<variable
name="handlers"
type="com.espresso.mvvmtestproject.MyHandlers"/>
</data>
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:gravity="center">
<TextView android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="20sp"
android:layout_gravity="center"
android:gravity="center"
android:textColor="@android:color/black"
android:text="First Text"/>
<TextView android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="20sp"
android:layout_gravity="center"
android:gravity="center"
android:textColor="@android:color/black"
android:text="Second Text"/>
<Button
android:text="Show Toast"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="@{handlers::onShowToast}"/>
</LinearLayout>
</layout>
MyHandlers.java
public class MyHandlers {
public void onShowToast(View view) {
Toast.makeText(view,"Clicked",Toast.LENGTH_SHORT).show();
}
}
ViewModel.java
public class ViewModel {
private Context mActivity;
public ViewModel(Context context) {
this.mActivity=context;
}
public void onShowToast(View view) {
Toast.makeText(mActivity,"Clicked",Toast.LENGTH_SHORT).show();
}
}
错误日志
Information:Gradle tasks [:app:clean, :app:generateDebugSources, :app:mockableAndroidJar, :app:prepareDebugUnitTestDependencies, :app:generateDebugAndroidTestSources, :app:assembleDebug]
D:\Projects\Trp\MvvmTestProject\app\src\main\java\com\espresso\mvvmtestproject\View.java
Error:(8, 48) error: package com.espresso.mvvmtestproject.databinding does not exist
Error:(15, 5) error: cannot find symbol class ActivityMainBinding
Error:Execution failed for task ':app:compileDebugJavaWithJavac'.
> java.lang.RuntimeException: Found data binding errors.
****/ data binding error ****msg:Listener class android.view.View.OnClickListener with method onClick did not match signature of any method handlers::onShowToast
file:D:\Projects\Trp\MvvmTestProject\app\src\main\res\layout\activity_main.xml
loc:40:31 - 40:51
****\ data binding error ****
Information:BUILD FAILED
Information:Total time: 4.396 secs
Information:3 errors
Information:0 warnings
Information:See complete output in console
在DataBinding库的更高版本中,您可以像这样绑定到click事件:
android:onClick="@{() -> viewModel.save()}"
然后,在您的viewmodel中,您可以像这样添加一个监听器:
public void save(){
...
}
从类中MyHandlers
接口。
public class MyHandlers {
public void onShowToast(View view);
}
在您的Activity
或Fragment
实现它,在您的情况下它将如下所示
public class View extends AppCompatActivity implements ViewContract.requiredMethods, MyHandlers{
ViewModel mModel;
ActivityMainBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//Setting the layout
binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
mModel=new ViewModel(getContext());
binding.setUser(mModel);
binding.setHandlers(this);
}
@Override
public void onShowToast(View view) {
Toast.makeText(view,"Clicked",Toast.LENGTH_SHORT).show();
}
}
覆盖你的接口方法onShowToast并设置绑定的处理程序,就是这样,你完成了点击事件
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.