DataBinding事件绑定
DataBinding事件绑定有两种方式
Method References(方法引用)和Listener Bindings(事件监听)
就先view设置点击事件也有两种方式view.setOnClickListener(View view)以及在XML中定义android:onClick=”“。
简单运行了textview和button的点击效果如下:
//XML代码如下
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<data>
<!--绑定数据-->
<variable
name="testBean"
type="com.example.minwenping.databindingdemo.TestBean" />
<!--绑定事件-->
<variable
name="eventListener"
type="com.example.minwenping.databindingdemo.MainActivity.ListenerBinding" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.minwenping.databindingdemo.MainActivity">
<!--备注先绑定之后在写数据或者事件-->
<TextView
android:layout_width="match_parent"
android:layout_height="40dp"
android:gravity="center"
android:onClick="@{eventListener::onClickText}"
android:text="@{testBean.tvText}" />
<Button
android:layout_width="match_parent"
android:layout_height="60dp"
android:layout_marginTop="16dp"
android:onClick="@{() -> eventListener.onTextChanged(testBean) }"
android:text="@{testBean.btnText}" />
</LinearLayout>
</layout>
//Activity代码
public class MainActivity extends AppCompatActivity {
TestBean bean = new TestBean("text新数据", "buttonXinshuju");
private ActivityMainBinding dataBinding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//contentview都绑定这里
dataBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
dataBinding.setTestBean(bean);
//第二种写法
// dataBinding.setVariable(BR.testBean,bean);
dataBinding.setEventListener(new ListenerBinding());
}
//事件方法引用
public class ListenerBinding {
//Method References方法直接引用类,但是参数规定死了
public void onClickText(View v) {
Toast.makeText(MainActivity.this, "点击:"+ ((TextView) v).getText(), Toast.LENGTH_SHORT).show();
}
//Listener Bindings 能够自定义传参数,比较灵活
public void onTextChanged(TestBean testBean){
testBean.setTvText("Listener Bindings 能回传参数");
dataBinding.setTestBean(testBean);
}
}
}
绑定出现的问题
错误: 找不到符号 符号: 类 ActivityMainBindingImpl 位置: 程序包 com.example.databinding.databinding
使用DataBinding,运行时出现错误,检查发现DataBinderMapperImpl.java和BR.java都能自动生成,但报错找不到databBindingImpl类,通过百度和检查发现是在XML界面文件上出错了,重点检查databinding的界面语法,比如, @{ }中的内容。
绑定事件不识别
<com.google.android.material.appbar.MaterialToolbar
app:navigationOnClickListener="@{navigationOnclickListener::onClick}"
android:id="@+id/topAppBar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:title="main"
app:navigationIcon="@drawable/ic_toolbar_menu"
style="@style/Widget.MaterialComponents.Toolbar.PrimarySurface"
android:background="@android:color/transparent"
android:elevation="0dp" />
如:
android:navigationOnClickListener="@{navigationOnclickListener::onClick}"
无效则改为
app:navigationOnClickListener="@{navigationOnclickListener::onClick}"