DataBinding基本使用(2)
咱们直接点,直接上实战,把常用的标签的用会了,用熟了
总的有以下几点
- 数据绑定的几种方式
- 点击事件绑定的几种方式
- 双向绑定数据
- RecycleView的数据绑定
- @InverseMethod 标签的使用
大家别急,其他的标签在相应的点里都会应用到
数据绑定的几种方式
<variable
name="tv1data"
type="String">
</variable>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.scs.myapplication.MainActivity">
<TextView
android:id="@+id/tv_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{tv1data}" />
<TextView
android:id="@+id/tv_2"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
改xml布局文件为MainActivity的
其实当你编写好布局文件的时候,AS就已经帮你把类和xml之间连接的枢纽类创建好了。
private ActivityMainBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.activity_main);
binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
binding.setTv1data("tv1_data");//加载数据 way1
binding.tv2.setText("tv2_data");//加载数据 way2
}
没错,ActivityMainBinding就是哪个数据,有人会问那么这个类在哪里,那么我有一句话不知当讲不当讲,在基本使用(1)中的贴图,你可以清清楚楚的看到它在哪里。
我们要通过ActivityMainBinding将Activity和布局稳健想绑定,故我们要注释调它 setContentView(R.layout.activity_main);
我发现~~~ 自从使用了DataBinding,我们再也不要findviewbyid了,使用BufferKnife不存在的。哈哈其实萝卜青菜 各有所爱。
方法1:就是传入我们在xml使用的<variable>的数据源,去给对应的View设置数据。setTv1data方法,是系统帮我们生产的。
方法2:就是利用id,通过ActivityMainBinding来找到对应的View,来给他设置参数
点击事件绑定的几种方式
点击的事件对应的方法从哪儿来?从对应的类来。对应的类在哪里?需要我们去写入类对应的地址。
这不点击事件的绑定不就解决了? 这时候 就需要用到这两个标签 <import><variable>
1.通过 <import>来导入点击事件所对于的类
2.通过<variable>已数据的方式来导入点击事件对应的类
方法1:
通过variable的方式,去引入一个接口
public interface IClick {
void onClick1(View view);
void onClick2(View view);
void onClick3(View view);
}
<variable
name="iclick"
type="com.example.scs.myapplication.IClick"></variable>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="@{iclick.onClick1}"
android:text="点击事件用法2" />
binding.setIclick(new IClick() {
@Override
public void onClick1(View view) {
Toast.makeText(view.getContext(), "方法1", Toast.LENGTH_SHORT).show();
}
@Override
public void onClick2(View view) {
}
@Override
public void onClick3(View view) {
}
});
方法2:
还可以在某个类中,定义一个方法,将该类<variable>或者<import>的方式引入
<variable
name="main"
type="com.example.scs.myapplication.MainActivity"></variable>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="@{main.onBtnChange}"
/>
public void onBtnChange(View view) {
Toast.makeText(view.getContext(), "方法2", Toast.LENGTH_SHORT).show();
}
<import type="com.example.scs.myapplication.MainActivity"></import>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="@{MainActivity.onBtnChange}"
/>
常用的事件绑定方式就这些。这时候有人会问如果是带参数的方法呢?里面的参数要如何去传递?别急下面就来讲解
方法3:
带参数的点击事件
<variable
name="iclick"
type="com.example.scs.myapplication.IClick"></variable>
<import type="android.view.View"></import>
<variable
name="tv1data"
type="String"></variable>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="带参数的方法"
android:onClick="@{(view)->iclick.onClick4(view,tv1data)}"/>
binding.setIclick(new IClick() {
@Override
public void onClick4(View view, String msg) {
Toast.makeText(view.getContext(), msg + "", Toast.LENGTH_SHORT).show();
}
});