Skip to content

Latest commit

 

History

History
207 lines (150 loc) · 5.01 KB

1.AndroidWidget.md

File metadata and controls

207 lines (150 loc) · 5.01 KB

目的

学习 AndroidWidget 的简单用法。

内容

用 xml 方式创建 view 进行 Widget 渲染

简介

AndroidWidget 是直接渲染 View 的最基础的 Widget。 因此很容易上手,贴近原来的开发方式。

效果

在中间显示 id 和 name

准备

layout

新建一个 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>

Bean

新建一个 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

createView

新建一个类 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);
    }

initView

创建完成之后呢? 正常来说是初始化 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();
    }

因为实在太简单了,所以我顺手就把两个控件的引用也获取了。

data

好像还缺点什么? 这个UI 还没设置数据,然而,作为一个普通的控件,天知道数据从哪来。

既然不知道,就让外面传进来吧(这样才符合 MVVM 的设计思想,UI不要去管数据怎么获取,或者什么时候获取)

在构造方法里加一个参数

    private UserBean user;

    public UserWidget(Context context, Lifecycle lifecycle, UserBean user) {
        super(context, lifecycle);
        this.user = user;
    }

update

有了数据,最后就是把数据显示到UI上了。

重写 update 方法。 你懂的。

    @Override
    public void update() {
        super.update();
        tvId.setText(user.getId() + "");
        tvName.setText(user.getName());
    }

render

好了,教程就此结... 等等,还有最后一个大问题,怎么应用到 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 时使用。

看到这里,你可能觉得,这框架好像没什么用。 别急,这一篇是让你对框架有一种熟悉的感觉,而不会上来就一脸懵逼。真正的好用之处还在后面。 相信你看这一篇并没有浪费多少时间,因为实在是太简单的。