Android TV开发,设置模块一般是一个菜单树,也即多级联动菜单,我们可以做成配置项文件,这样做的好处是,不需要根据每个客户需求去控制菜单列表里的菜单项显示隐藏,减少项目维护成本。
那么这个配置项怎么去设计比较好呢?因为需求是产品控制的,我们希望配置项文件由产品来编写和维护,对于产品来说,我们让他去编写json配置文件或者xml文件,有点为难人,术业有专攻,他们更喜欢可视化操作,简单、直观,于是我们想到了Excel表格,因为每次测试的buglist或者产品的功能需求矩阵都是以Excel表形式发给我们的。
按道理来说,我们拿到Menu Tree Excel表,程序去解析这个表格,构建菜单实体类就行了,为什么要再解析成json文件呢?因为每次解析Excel表格获取数据,效率肯定很低,目前知道的Java读取Excel的工具有jxl跟poi方式,两个都有数据量大小限制,并且解析大量数据会很耗时,这个会影响UI绘制,所以我们只希望应用首次安装解析一次产品推送在系统中的Excel表格,然后转成json文件,并保存在系统级别目录中, 以后应用每次启动去解析json配置项获取数据就好。
解析Excel,这里采用jxl,是综合了jxl和poi优缺点以及具体的需求来抉择的。jxl稍微轻量级点,但是不支持xlsx格式,所以只能用 Microsoft Office 2007及之前版本,poi功能强大点,但是要引入的库比较多,使用起来也稍复杂,我们解析Excel表操作一般只会走一次,除非产品变更了需求,会再解析一次,大部分时候,我们程序都是做json转菜单实体类操作。
下面就开始我们的实践吧!
menu tree excel表
步骤一:定义菜单实体类
SettingMenuBean
public class SettingMenuBean implements Parcelable {
public String menuId; //菜单id
public String parentId; //菜单父级id
public String menuName; //菜单名
public String menuIcon; //菜单图标
public String type; //菜单显示样式
public List<SettingMenuBean> menus = new ArrayList<>(); //子菜单
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(this.menuId);
dest.writeString(this.parentId);
dest.writeString(this.menuName);
dest.writeString(this.menuIcon);
dest.writeString(this.type);
dest.writeList(this.menus);
}
public SettingMenuBean() {
}
protected SettingMenuBean(Parcel in) {
this.menuId = in.readString();
this.parentId = in.readString();
this.menuName = in.readString();
this.menuIcon = in.readString();
this.type = in.readString();
this.menus = new ArrayList<>();
in.readList(this.menus, SettingMenuBean.class.getClassLoader());
}
public static final Parcelable.Creator<SettingMenuBean> CREATOR = new Parcelable.Creator<SettingMenuBean>() {
@Override
public SettingMenuBean createFromParcel(Parcel source) {
return new SettingMenuBean(source);
}
@Override
public SettingMenuBean[] newArray(i