Android复杂界面布局解决方案

时间:2024-02-20 10:49:49

    最近接近年关,公司项目没什么事情做。闲暇之余的时间笼统的做了一个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();

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55

就是这样,以后再新加模板的时候直接继承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;
        }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

千万别看错了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;
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

其中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
    }, 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

总结

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

这里写图片描述

--------------------- 本文来自 jixiongxu 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/jixiongxu/article/details/79047951?utm_source=copy