学习 AndroidWidget 的简单用法。
用 xml 方式创建 view 进行 Widget 渲染
AndroidWidget 是直接渲染 View 的最基础的 Widget。 因此很容易上手,贴近原来的开发方式。
在中间显示 id 和 name
新建一个 activity_user.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:id="@+id/v_root"
android:gravity="center"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tv_id"
android:gravity="center"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/tv_name"
android:gravity="center"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
新建一个 UserBean.java 用于承载数据
public class UserBean implements Serializable {
private Integer id;
private String name;
public UserBean() {
}
public UserBean(Integer id, String name) {
this.id = id;
this.name = name;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "UserBean{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
'}';
}
}
新建一个类 UserWidget 继承 AndroidWidget,泛型可填 View 或 LinearLayout(因为xml中root是 LinearLayout)。 这个类就是用来渲染效果中的UI。
继承之后,需要实现 构造方法 和 createView
,
public class UserWidget extends AndroidWidget<View> {
public UserWidget(Context context, Lifecycle lifecycle) {
super(context, lifecycle);
}
@Override
public View createView(Context context) {
return null;
}
}
看到 createView
我习惯性的就在这 inflate 了一个 view。
public View createView(Context context) {
return View.inflate(context, R.layout.activity_user, null);
}
创建完成之后呢?
正常来说是初始化 view,所以这里再重写一个 initView
方法。
private TextView tvId;
private TextView tvName;
@Override
public void initView(View view) {
super.initView(view);
tvId = view.findViewById(R.id.tv_id);
tvName = view.findViewById(R.id.tv_name);
update();
}
因为实在太简单了,所以我顺手就把两个控件的引用也获取了。
好像还缺点什么? 这个UI 还没设置数据,然而,作为一个普通的控件,天知道数据从哪来。
既然不知道,就让外面传进来吧(这样才符合 MVVM 的设计思想,UI不要去管数据怎么获取,或者什么时候获取)
在构造方法里加一个参数
private UserBean user;
public UserWidget(Context context, Lifecycle lifecycle, UserBean user) {
super(context, lifecycle);
this.user = user;
}
有了数据,最后就是把数据显示到UI上了。
重写 update
方法。 你懂的。
@Override
public void update() {
super.update();
tvId.setText(user.getId() + "");
tvName.setText(user.getName());
}
好了,教程就此结... 等等,还有最后一个大问题,怎么应用到 Activity 中呢?
调用 WidgetUtils.render()
方法,会返回一个 view,把这 view 设置成 contentView 就可以了。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
UserBean user = new UserBean(1, "ittianyu");
View root = WidgetUtils.render(this, UserWidget.class, user);
setContentView(root);
}
除了用工具类,你还可以直接通过 new 创建 Widget 的实例并调用 render
方法。直接 new 需要手动传入 context 和 lifecycle 引用。
View root = new UserWidget(this, getLifecycle(), user).render();
除了在 activity 中渲染,实际上可以嵌入到任何支持 View 的地方,但一般来说,只有 activity / fragment / widget 才能拿到 lifecycle 引用,所以其他地方嵌入时,会有点小麻烦。
这里简单介绍了 AndroidWidget 的用法。 适合在需要直接渲染 XML 时使用。
看到这里,你可能觉得,这框架好像没什么用。 别急,这一篇是让你对框架有一种熟悉的感觉,而不会上来就一脸懵逼。真正的好用之处还在后面。 相信你看这一篇并没有浪费多少时间,因为实在是太简单的。