Android DataBinding布局的加载深入探究
什么是DataBinding
DataBinding 是在Android数据驱动开发中增强UI绑定的一项新功能,简化了通过代码获取视图变量的步骤,同时实现了单项和双向数据绑定。
DataBinding核心类
ViewDataBinding
ViewDataBinding 是DataBinding中的核心类,它是一个抽象类,其他所有的 DataBinding 类都是它的子类。ViewDataBinding可以理解为我们绑定一个layout文件的关键类,这个类可以根据layout文件生成对应的:@Binding类。其它的Binding类只是@Binding类的继承类,主要是针对全局变量的问题进行优化。
理解Binding类
Binding类是由过你定义的xml文件(BR)自动生成,例如我们定义了一段xml片段
< TextView android:id="@+id/showname"
android:text="@{user.name}" />
对于这段xml,会自动生成一个 Binding 类:
public abstract class ItemUserBinding extends ViewDataBinding {
@NonNull
public final TextView showname;
//....
//这里可以看到生成的变量 showname,通过 showname 可以直接去操作对应的 View .
protected ItemUserBinding(Object _bindingComponent, View _root, int _localFieldCount) {
super(_bindingComponent, _root, _localFieldCount);
final Object[] bindings = mapBindings(_root, _localFieldCount, sIncludes, sViewsWithIds);
this.showname = (TextView) bindings[0];
}
//....
}
这个类包含 View 和 UI 中使用的变量与布局。当您需要更新 View 的值时,直接从生成的 Binding 类中访问它们。
DataBinding的使用
第一种使用方式:在布局文件中使用DataBinding
我们知道,在普通的布局文件中直接使用 ${ } 表达式绑定变量。在使用 DataBinding 的布局文件中:
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:text="@{user.name}"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
</layout>
在 Activity 中使用 DataBinding:
public class MainActivity extends AppCompatActivity {
private ActivityMainBinding dataBinding; //这里为生成的ActivityMainBinding绑定类
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//获取DataBinding对象
dataBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
User user = new User("hongtao", "123456");
//将user对象与DataBinding中定义的user绑定
dataBinding.setUser(user);
}
}
第二种使用方式:在代码中使用DataBinding
方法一:手动引用布局并初始化DataBinding对象
ActivityMainBinding dataBinding = ActivityMainBinding.inflate(layoutInflater, null, false);
setContentView(dataBinding.getRoot());
User user = new User("hongtao", "123456");
dataBinding.setUser(user);
方法二:使用DataBinding.bind()
ActivityMainBinding dataBinding = DataBindingUtil.bind(findViewById(android.R.id.content));
User user = new User("hongtao", "123456");
dataBinding.setUser(user);
下面通过代码示例进一步了解DataBinding的使用
示例一:Button绑定监听事件
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
tools:context=".MainActivity">
<data>
<variable
name="message"
type="String" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="@{() -> customOnClick()}"/>
</LinearLayout>
</layout>
ActivityMainBinding dataBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
dataBinding.setMessage("Button点击");
dataBinding.setCallback(new MainActivityCallback());
class MainActivityCallback {
public void customOnClick() {
Toast.makeText(MainActivity.this, "Click Button!!!", Toast.LENGTH_SHORT).show();
}
}
示例二:RecyclerView绑定数据
RecyclerView 是Android中一个通过 Adapter 提供数据并显示数据的 View。
<layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<variable
name="adapter"
type="com.example.databinding.recyclerview.MainAdapter" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<androidx.recyclerview.widget.RecyclerView
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
app:adapter="@{adapter}"
android:layout_Width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
</layout>
//新建一个Adapter
class MainAdapter extends RecyclerView.Adapter<MainAdapter.MyViewHolder> {
private List<User> users;
private Context mContext;
public MainAdapter(Context context, List<User> data) {
this.mContext = context;
this.users = data;
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
LayoutInflater inflater = LayoutInflater.from(viewGroup.getContext());
ItemUserBinding binding = DataBindingUtil.inflate(inflater, R.layout.item_user, viewGroup, false);
return new MyViewHolder(binding);
}
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
User user = users.get(position);
holder.binding.setUser(user);
}
@Override
public int getItemCount() {
return users.size();
}
//Binding类ViewHolder
class MyViewHolder extends RecyclerView.ViewHolder {
ItemUserBinding binding;
public MyViewHolder(ItemUserBinding binding) {
super(binding.getRoot());
this.binding = binding;
}
}
}
//Activity
ActivityMainRecyclerViewBinding recyclerViewBinding = DataBindingUtil.setContentView(this, R.layout.activity_main_recycler_view);
List<User> users = new ArrayList<>();
users.add(new User("hongtao", "123456"));
users.add(new User("jiangyan", "654321"));
users.add(new User("xiaohui", "111111"));
MainAdapter mAdapter = new MainAdapter(MainActivity.this, users);
//将Adapter与DataBinding中定义的adapter绑定
recyclerViewBinding.setAdapter(mAdapter);
参考资料
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android DataBinding布局的加载深入探究 - Python技术站