OmniCommonUI框架

OmniCommonUI框架

OmniCommonUI框架在不修改原有布局文件的基础上去加载显示我们的公共UI,只需要一个属性的添加即可。很好的解决了开发过程中再次返工修改布局文件去添加公共UI的问题。公共UI即:loading加载页,无数据页,无网络页等。

在日常开发中,我们的XML布局文件除了展示视觉稿中的组件外,还需要添加,如Loading布局文件、无数据时的展示、无网络时的展示等等。这些都是我们在正常开发完成后,二次返工时做的。

这块工作一是没有技术的难度,二是非常繁琐,每个业务在开发完成后必须得二次返工。所以每个团队对于这些公共UI的加载都有自己的机制以使这块的工作在最大程度上减少。

通过分析调查,目前对于公共UI的显示处理分为以下几种情况:

1,在需要展示公共UI的组件外层嵌套一层FramLayout,然后这这个FrameLayout中再通include引用公共UI,如下图:

我们正常的业务开发,只需要中间“正文内容”一个布局,最终却成了上述所出现的情况,必须是大多数布局文件中都得copy这么一大段。

2,自定义布局,通过自定义一个布局,在自定义的布局中自动加载各种公共UI,如下图:

这种做法就比第一种做法好了很多,在布局外面只是多加了一层布局,改动看起来也不是很大。这也是目前使用的相对较多的一种做法。

3,一样是自定义布局。和上面不同的是,将所有有可能用到的布局都继承且重写相关方法,这些自定义的布局带有原布局的所有功能,并且附带有对公共UI的加载功能,如下图:

在需要用到LinearLayout时,那就换用成自定义的CustomLinearLayout,那么相对布局,帧布局,ScrollView,ListView等等,所有的系统ViewGroup都得继承扩展一下,那开发起来就很苦逼了,因为每次都得复制这么长的包名与类名,自定义的组件在xml中使用时代码提示是不支持的。

大体就这三种情况,这些从某种意义上确实或多或少解轻了一些繁琐的事情 。它们都是一种可借鉴的封装思想,很难产品化的让其它团队去使用。那有没有产品化的解决方案呢?产品化的的解决方案就是无侵入、兼容、可插拔。一句话甚至一个属性就搞定,下面是我的研究结果。

大家看看我的解决方案:

上面的布局是系统原生的组件,需要在这一块展示公共UI,现在只需要在该布局中添加几个额外的属性即可。

omni:omni_nonet="no_net"表示无网络时在这里显示no_net.xml布局;

omni:omni_nodata=“com.example.reshello.fragment.NodataFragment”表示无数据时在这里显示NodataFragment这个fragment;

在不改变原有布局的情况下,很轻松的添加对公共UI显示的支持。这些就是我们OmniCommonUI框架做的事情,在项目中只需引入一个几十K的JAR包即可实现上述功能。

在某些公共UI中有事件需要处理,因此这里也支持Fragment。如无数据时页面中的重试按钮的点击事件。

OmniCommonUI框架使用说明如下:

一、Activity的onCreate初始化:

private CommonUIService mCommonUIService;

onCreate方法中添加:

mCommonUIService = OmniCommon.getInstance().getCommonUIService(this);

mCommonUIService.setContentView(R.layout.activity_main);

这两句取代:setContentView(R.layout.activity_main);

二、在XML中:

在需要用到公共UI(loading/无数据/无网络等)的xml的最外层布局添加:

xmlns:tools="http://schemas.android.com/tools"

xmlns:omni="http://com.example.reshello/android"

tools:ignore=“all"

其中xmlns:omni的全名空间为”http://包名/android”,包名为Manifest中注册的package。

三、在需要显示公共UI的组件上添加属性:

omni:omni_nodata="com.example.reshello.fragment.NodataFragment"

omni:omni_nonet=“no_net”

上面两句话表示在无数据时,页面这块加载NodataFragment,没有网络时,加载显示no_net.xml这个布局文件。

其中omni_nodata与omni_nonet这两个标签可以随便定义。只是必须以omni_开头即可。

四、在Activity中调用时:

1,显示某个属性对应的xml或者是fragment时:

mCommonUIService.show(R.id.layout_center, “omni_nodata”);

调用上面这句,表示在R.id.layout_center这个组件上显示omni_nodata标签所对应的Fragment(第三步中定义好的fragment),这里的omni_nodata只需保证与第三步中定义的标签一致,但必须以omi_开头

2,隐藏某个view上面所有的公共UI时调用:

mCommonUIService.dismiss(R.id.layout_center);

表示隐藏R.id.layout_center上面所有的公共UI。

五、Fragment中事件的支持:

如在无数据页面上有一个“重试”按钮,点击该按钮时需要调用Activity中的tryAgain()方法进行网络数据的重新加载。

1,在Fragment中添加:

click事件的支持:

@InjectRuntime(id=R.id.try_again, click="tryAgain")

private Button try_again;

try_again是重试按钮,在该定义上添加@InjectRuntime标签,第一个参数为按钮在xml中的id,第二个参数为Activity中的方法。

该标签首先会自动注入try_again,以后无需再findViewById.其次在点击该按钮时会自动调用Activity中的tryAgain方法(前提是Activity中得有该方法)。public void tryAgain(View v);//参数v为try_again的句柄

touch事件的支持:

@InjectRuntime(id=R.id.try_again, touch="touchAgain")

private Button try_again;

和click事件一样。touchAgain为Activity中的方法,方法格式为:

public void touchAgain(View v, MotionEvent event);

下面是使用时的代码截图:

xml:

JAVA代码:

随后附上一个demo与本框架的jar包

时间: 2024-08-24 06:38:56

OmniCommonUI框架的相关文章

基于jquery开发的UI框架整理分析

根据调查得知,现在市场中的UI框架差不多40个左右,不知大家都习惯性的用哪个框架,现在市场中有几款UI框架稍微的成熟一些,也是大家比较喜欢的一种UI框架,那应该是jQuery,有部分UI框架都是根据jQuery研发出来的产品,现在也很常见了. 国产jQuery UI框架 (jUI) DWZ DWZ富客户端框架(jQuery RIA framework), 是中国人自己开发的基于jQuery实现的Ajax RIA开源框架.设计目标是简单实用,快速开发,降低ajax开发成本. jQuery 部件布局

静态网页框架设计首次体验(文章改)

根据教材与上网成功解决了Tomcat与Myeclipse的安装,同时熟悉了Java web创建项目到部署运行整个过程.今天起正式开始学习有关Java web的编程部分.Java web静态网页(HTML网页)的标记含义.基本语法的介绍到框架设计基本模板与案例,今天的学习的内容,让网页编程有了一个初步的框架.结合自身所在协会的情况,计划制作一个关于协会的网页,已有初步想法,望通过学习不断完善和修改协会网站.根据今天所学,并参考书本30页框架设计案例对网页进行初步搭建. 具体代码如下 TW.jsp:

.NET深入解析LINQ框架(五:IQueryable、IQueryProvider接口详解)

阅读目录: 1.环路执行对象模型.碎片化执行模型(假递归式调用) 2.N层对象执行模型(纵横向对比链式扩展方法) 3.LINQ查询表达式和链式查询方法其实都是空壳子 4.详细的对象结构图(对象的执行原理) 5.IQueryable<T>与IQueryProvider一对一的关系能否改成一对多的关系 6.完整的自定义查询 1]. 环路执行对象模型.碎片化执行模型(假递归式调用) 这个主题扯的可能有点远,但是它关系着整个LINQ框架的设计结构,至少在我还没有搞懂LINQ的本意之前,在我脑海里一直频

.NET深入解析LINQ框架(一:LINQ优雅的前奏)

阅读目录: 1.LINQ简述 2.LINQ优雅前奏的音符 2.1.隐式类型 (由编辑器自动根据表达式推断出对象的最终类型) 2.2.对象初始化器 (简化了对象的创建及初始化的过程) 2.3.Lambda表达式 (对匿名方法的改进,加入了委托签名的类型推断并很好的与表达式树的结合) 2.4.扩展方法 (允许在不修改类型的内部代码的情况下为类型添加独立的行为) 2.5.匿名类型 (由对象初始化器推断得出的类型,该类型在编译后自动创建) 2.6.表达式目录树(用数据结构表示程序逻辑代码) 3.LINQ

.NET深入解析LINQ框架(二:LINQ优雅的前奏)

阅读目录: 1.LINQ框架的主要设计模型 1.1.链式设计模式 (以流水线般的链接方式设计系统逻辑) 1.2.链式查询方法(逐步加工查询表达式中的每一个工作点) 2.LINQ框架的核心设计原理 2.1.托管语言之上的语言(LINQ查询表达式) 2.2.托管语言构造的基础(LINQ依附通用接口与查询操作符对应的方法对接) 2.3.深入IEnumerable.IEnumerable<T>.Enumerable(LINQ to Object框架的入口) 2.4.深入IQueryable.IQuer

.NET深入解析LINQ框架(四:IQueryable、IQueryProvider接口详解)

阅读目录: 1.开篇介绍 2.扩展Linq to Object (应用框架具有查询功能) 2.1.通过添加IEnumerable<T>对象的扩展方法 2.2.通过继承IEnumerable<T>接口 2.3.详细的对象结构图 3.实现IQueryable<T> .IQueryProvider接口 3.1.延迟加载IEnumertor<T>对象(提高系统性能) 3.2.扩展方法的扩展对象之奥秘(this IQueryable<TSource> so

.NET深入解析LINQ框架(三:LINQ优雅的前奏)

阅读目录: 1.动态LINQ查询(动态构建Expression<T>表达式树) 2.DLR动态语言运行时(基于CLR之上的动态语言运行时) 1].动态LINQ查询(动态构建Expression<T>表达式树) 什么是动态LINQ查询?LINQ的编写是静态的,因为C#是基于静态类型系统原理设计的,在编写时已经确定类型,也就是在编译时就已经知道将要执行什么样的查询,条件是什么.排序方式是什么等等.那么很大一部分应用场合中我们需要根据用户的选择来查询数据源,以往我们都是通过判断的方式来拼

Asp.Net MVC及Web API框架配置会碰到的几个问题及解决方案 (精髓)

前言 刚开始创建MVC与Web API的混合项目时,碰到好多问题,今天拿出来跟大家一起分享下.有朋友私信我问项目的分层及文件夹结构在我的第一篇博客中没说清楚,那么接下来我就准备从这些文件怎么分文件夹说起.问题大概有以下几点: 1.项目层的文件夹结构 2.解决MVC的Controller和Web API的Controller类名不能相同的问题 3.给MVC不同命名空间的Area的注册不同的路由 4.让Web API路由配置也支持命名空间参数 5.MVC及Web API添加身份验证及错误处理的过滤器

10大APP界面框架设计模式详解

随着移动互联网的发展,移动app已经成为了每个互联网公司的标配了,那作为产品经理,我们如何设计出更加符合用户体验的app产品呢?今天和大家分享的就是10中最常见的app界面光甲设计模式,一起来看看吧. 1.标签导航 标签导航是十大界面框架设计里最常用的界面框架设计,也是被业界之内公认的一种普遍使用的页面框架设计.那么这种页面框架设计在作业方面对一个用户来说也是最常见的一种页面框架设计,比如说微博.微信.手机百度.支付宝.淘宝,这些我们所谓的超级APP都是运用的标签导航,无一例外.从这个角度也可以