Android复杂界面布局解决方案

2018-01-13 11:06:12来源:网络收集作者:咖啡不加糖人点击

分享

阿里云爆款

前言


    最近接近年关,公司项目没什么事情做。闲暇之余的时间笼统的做了一个app的框架(虽然我不知道这样算不算是框架)。
     我们知道,很多App的界面是非常复杂的,如果按照常规的方法去写layout.xml文件的话,app在控件少的时候没有问题,但是如果控件一旦变多,或者控件之间的嵌套非常复杂的时候,后期维护成本是非常巨大的,第一是代码非常复杂,很难看懂。第二是app加载耗时会增加(有可能出现anr,比如LinearLayout的嵌套加载就比较耗时),第三是app不够灵活,界面都被固定住了。那么基于这样一个需求今天将给出一个解决方案。


——————————————— 手动分割线 ———————————————–


实现
     先说一下思路,其实思路还是比较简单的,就是采用ListView中的item加载各种不同的模板,再往模板中填充数据和处理模板中的跳转等各个机制。
    根据上面提供思路,现在来分析一下所需的各个类:
    1、需要一个listView,作为模板的容器。
    2、需要一个BaseView,作为模板的基类,因为模板需要填充数据,因此需要方法setData(),fillData(),跳转支持onItemClick()等,当然如果模板需要支持其他的公共方法也可以写在基类中;
    3、需要一个BaseModule,作为模板数据的基类,封装了各个模板需要的数据;
直接上BaseView代码:


package com.xspace.ui.template;
import Android.content.Context;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.widget.LinearLayout;
import com.xspace.module.BaseModule;
import com.xspace.ui.jumputils.CategoryUtil;
public abstract class BaseView extends LinearLayout
{
protected int viewCode = 0;
protected Context mContext;
protected BaseModule module;
public BaseView(Context context)
{
super(context);
mContext = context;
}
public BaseView(Context context, @Nullable AttributeSet attrs)
{
super(context, attrs);
mContext = context;
}
protected void onItemClick(BaseModule module)
{
CategoryUtil.jumpByTargetLink(mContext, module, viewCode);
}
public BaseModule getModule()
{
return this.module;
}
public Context getmContext()
{
return this.mContext;
}
public abstract void setData(BaseModule module);
public abstract void fillData(BaseModule module);
public abstract void addTemplateView();
public abstract void reFresh();
}

就是这样,以后再新加模板的时候直接继承BaseView就可以。


那么又是如何去实现添加模板呢,其实和我们使用listview添加数据一样。其中listview中的getView方法如下:
@Override
public View getView(int i, View view, ViewGroup viewGroup)
{
if (pageModule == null || pageModule.templateModules == null)
{
return null;
}
BaseView template = TemplateManager.findViewById(context, pageModule.templateModules.get(i).templateId);
if (template == null)
{
return null;
}
template.setData(pageModule.templateModules.get(i));
view = template;
return view;
}

千万别看错了findViewById方法,findViewbyId方法如下:


public static BaseView findViewById(Context context, String tempId)
{
if (tempId == null || tempId.equals(""))
{
return null;
}
if (tempId.equals(TemplateConstant.template_index_item))
{
return new TemplateIndexItem(context);
}
else if (tempId.equals(TemplateConstant.template_banner))
{
return new TemplateBanner(context);
}
else if (tempId.equals(TemplateConstant.template_end_banner))
{
return new TemplateEndBanner(context);
}
else if (tempId.equals(TemplateConstant.template_cover))
{
return new TemplateCover(context);
}
else if (tempId.equals(TemplateConstant.template_grid))
{
return new TemplateGrid(context);
}
else if (tempId.equals(TemplateConstant.template_grid_2))
{
return new TemplateGrid2(context);
}
else if (tempId.equals(TemplateConstant.template_grid_3))
{
return new TemplateGrid3(context);
}
return null;
}

其中new TemplateXXX() 就是模板。这样就可以加入到item了哦。
当然数据类就不在这里说明了,给大家看一组数据格式:


{
"templateId": "template_cover",
"img_url": "http://img.kaiyanapp.com/0bf15aca2a5a3d371d04275c2b208e2a.png?imageMogr2/quality/60/format/jpg",
"title": "精选图集0",
"subtitle": "#搞笑#全能搞笑集锦",
"description": "首先要明确1个概念,在android上,“沉浸式”叫沉浸式全屏模式以及透明化系统状态栏其实这个也没啥好说的,不管你是android粉还是IOS粉,在日常玩机的过程中,都见过这种界面效果0",
"errorCode": 0
},

总结


写到现在我都觉得我自己看不懂,具体大家还是去GitHub下载下来看,绝非打广告骗流量。
差点就忘了附图了,我也才写了几组模板。凑合看吧。


Android复杂界面布局解决方案


最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台