`
sd6733531
  • 浏览: 66538 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

QADDroid—android快速原型框架

 
阅读更多

 

一、为什么造轮子

一来android现在的轮子比较少. 二来,写轮子可以锻炼自己,逼迫自己深入学习.造轮子的乐趣实践者会比较容易理解,不管是阅读美好的设计,还是迭代改善自己的设计,都会给程序员带来快乐.

二、关于QADDroid

QADDroid正如其名,目标是帮助android程序员简单粗暴地快速开发.它的组成部分如下:

1.Base组件:提供了android基本组件的Base版本,包含许多便捷的方法.

2.AutoInject:仿照roboguice的inject注解.但也只包含这些注解,没有与guice结合.(guice太大了 = =) 

3.Loader:客户端程序80%的时候需要做联网开发.这其中通常是非常耗费程序员精力的,又要管理线程,又要管理连接.Loader希望将程序员从中解脱出来.它将加载服务的逻辑与加载器(线程模型)分离开来.

4.Render:其实是注入的另外一种.使用它可以摆脱编写Adapter以及众多的view.setXX方法.

5.其它:抄袭并精简了nutz的lang包代码.对其做了android版加强,并添加了若干工具类.

这是github的路径.https://github.com/13leaf/QADDroid

三、下面晾一点代码给大家看看:

package com.qad.demo.inject;

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import com.qad.annotation.InjectPreference;
import com.qad.annotation.InjectResource;
import com.qad.annotation.InjectSystemService;
import com.qad.annotation.InjectView;
import com.qad.app.BaseActivity;
import com.qad.demo.R.id;
import com.qad.demo.R.layout;
import com.qad.demo.R.string;
import com.qad.demo.net.DownLoadDemo;
import com.qad.util.NotificationBuilder;

public class InjectActivity extends BaseActivity {

	//inject resource
	@InjectResource(id=string.hello) String helloText;
	
	//inject views
	@InjectView(id=id.inject_button) Button injectedButton;
	@InjectView(id=id.inject_textview) TextView injectedTextView;
	
	//inject system service
	@InjectSystemService(name=LAYOUT_INFLATER_SERVICE)
		LayoutInflater inflater;
	
	@InjectSystemService(name=NOTIFICATION_SERVICE)
		NotificationManager notificationManager;
	
	//we can inject preference by key's name string
	@InjectPreference(name="first")
		String firstName;
	//or we can inject preference by key's resource id
	@InjectPreference(id=string.key_second)
		String secondName;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
		showMessage("injectPreference:"+firstName+" "+secondName);
		
		Notification notification=buildNotification();
		notificationManager.notify(1, notification);
		
		//system Service is first injected
		View contentView=inflater.inflate(layout.inject_view_demo, null);
		setContentView(contentView);
		//auto inject view complete
		injectedTextView.setText("I have been injected");
		injectedButton.setText("Click Me!");
		injectedButton.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				showMessage("hello resource is "+helloText);
			}
		});
		
	}

	private Notification buildNotification() {
		PendingIntent pendingIntent=
				PendingIntent.getActivity(this, 0, new Intent(this,DownLoadDemo.class), 0);
		PendingIntent deleteIntent=
				PendingIntent.getActivity(this, 0, new Intent(this,QadSetting.class), 0);
		return new NotificationBuilder(this)
					.setTicker("Inject ok!")
					.setContentTitle("Inject Activity")
					.setContentText("InjectView will done after setContentView")
//					.setSmallIcon(drawable.default_thumb)
					.setOnlyAlertOnce(true)
					.setAutoCancel(true)
					.setContentIntent(pendingIntent)
					.setDeleteIntent(deleteIntent)
					.getNotification();
	}
}

 

由于NotificationBuilder是3.0版才开始的.于是烦躁的楼主自己写了个兼容到1.6的NotificationBuilder...

package com.qad.demo.loader;

import java.io.File;
import java.util.Random;

import android.os.Bundle;
import android.os.Environment;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ImageView;

import com.qad.app.BaseActivity;
import com.qad.loader.ImageLoader;
import com.qad.loader.service.LoadServices;

public class Loader1 extends BaseActivity {

	File cacheFolder = new File(Environment.getExternalStorageDirectory(),
			"qad/cache");
	ImageLoader loader;
	ImageView imageView;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		loader=new ImageLoader(
				LoadServices.newHttpImage2Cache(cacheFolder,this));
		imageView=new ImageView(this);
		loader.startLoading(getNextImage(),imageView);
		setContentView(imageView);
	}
	
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		menu.add("换一张");
		return super.onCreateOptionsMenu(menu);
	}
	
	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		loader.startLoading(getNextImage(),imageView);
		showMessage("载入中..请等待");
		return super.onOptionsItemSelected(item);
	}
	
	@Override
	protected void onDestroy() {
		super.onDestroy();
		loader.destroy(false);//释放loader。这将杀死loader的后台线程
	}
	
	public String getNextImage()
	{
		if(currentImage==null){
			currentImage=images[random.nextInt(images.length)];
		}else {
			String temp=currentImage;
			while(temp.equals(currentImage))
			{
				currentImage=images[random.nextInt(images.length)];
			}
		}
		return currentImage;
	}
	
	Random random=new Random();
	String currentImage;
	String[] images={
			"http://png-1.findicons.com/files//icons/374/shiny_smiley/128/happy.png",
			"http://png-4.findicons.com/files//icons/1943/yazoo_smilies/128/smile.png",
			"http://png-5.findicons.com/files//icons/1786/oxygen_refit/128/face_smile.png",
			"http://png-1.findicons.com/files//icons/2198/dark_glass/128/emoticon.png",
			"http://png-4.findicons.com/files//icons/360/emoticons/128/smile_7.png",
			"http://png-1.findicons.com/files//icons/350/aqua_smiles/128/fun.png",
			"http://png-5.findicons.com/files//icons/2015/24x24_free_application/24/smile.png",
			"http://png-2.findicons.com/files//icons/360/emoticons/128/happy.png",
			"http://png-5.findicons.com/files//icons/360/emoticons/128/smile_4.png",
			"http://png-4.findicons.com/files//icons/2166/oxygen/22/face_smile.png",
			"http://png-5.findicons.com/files//icons/753/gnome_desktop/64/gnome_face_smile.png",
			"http://png-5.findicons.com/files//icons/408/vista_halloween/128/smile.png",
			"http://png-1.findicons.com/files//icons/350/aqua_smiles/128/happy.png",
			"http://png-5.findicons.com/files//icons/376/the_blacy/128/big_smile.png",
			"http://png-3.findicons.com/files//icons/1943/yazoo_smilies/128/big_smile.png",
			"http://png-1.findicons.com/files//icons/2198/dark_glass/128/presence_offline.png",
			"http://png-3.findicons.com/files//icons/360/emoticons/128/ok.png",
			"http://png-2.findicons.com/files//icons/360/emoticons/128/smile_1.png",
			"http://png-3.findicons.com/files//icons/1786/oxygen_refit/128/face_gearhead_male_smile.png",
			"http://png-3.findicons.com/files//icons/360/emoticons/128/glad.png",
			"http://png-2.findicons.com/files//icons/2023/standard_smile/48/smile.png",
			"http://png-4.findicons.com/files//icons/2192/flavour_extended/48/emote_smile.png",
			"http://png-1.findicons.com/files//icons/238/santa_claus/128/happy_santaclaus.png",
			"http://png-4.findicons.com/files//icons/1035/human_o2/128/face_smile.png"
	};

}

 

ImageLoader继承自QueueLoader.启用的是单线程,队列任务的模型.
注意LoadServices工厂生成了包含二级缓存的LoadService(内存+持久),执行载入任务时将会有缓存策略。详细策略
下次会说明

贴个图:



 

package com.qad.demo.render;

import com.qad.render.Render;
import com.qad.render.RenderType;

public class RenderEntitiy2 {
	public RenderEntitiy2(String thumb, String title, String updateTime,
			String content) {
		super();
		this.thumb = thumb;
		this.title = title;
		this.updateTime = updateTime;
		this.content = content;
	}
	@Render(type=RenderType.image)
	private String thumb;
	@Render
	private String title;
	@Render
	private String updateTime;
	@Render
	private String content;
	public String getThumb() {
		return thumb;
	}
	public void setThumb(String thumb) {
		this.thumb = thumb;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getUpdateTime() {
		return updateTime;
	}
	public void setUpdateTime(String updateTime) {
		this.updateTime = updateTime;
	}
	public String getContent() {
		return content;
	}
	public void setContent(String content) {
		this.content = content;
	}
}

 

package com.qad.demo.render;

import java.util.ArrayList;

import android.os.Bundle;

import com.qad.app.BaseListActivity;
import com.qad.demo.R.drawable;
import com.qad.demo.R.layout;
import com.qad.loader.ImageLoader;
import com.qad.loader.service.LoadServices;
import com.qad.render.RenderEngine;

public class Render2 extends BaseListActivity{

	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		ArrayList<RenderEntitiy2> entities=buildEntities();
		RenderEngine.render(getListView(), layout.render2, entities,new ImageLoader(LoadServices.newHttpImageNoCache(me),getResources().getDrawable(drawable.icon)),null);

	}

	private ArrayList<RenderEntitiy2> buildEntities() {
		ArrayList<RenderEntitiy2> entities=new ArrayList<RenderEntitiy2>();
		entities.add(new RenderEntitiy2("", "德国14岁少年校园开枪射击 操场与警方对峙", "2012-05-23 11:16:00", "德国警方逮捕一名在校园内开枪射击的14岁少年。中新网5月23日电据外电报道,德国巴伐利亚州梅明根市一名14岁少年22日在校园内持枪射击,后遭到警方逮捕。据悉,该男孩当时在学校的操场内与警方对峙,还将枪指向自己威胁要自杀。报"));
		entities.add(new RenderEntitiy2("http://res01.mimg.ifeng.com/g?url=http://y1.ifengimg.com/news_spider/dci_2012/05/2752bf82d2c00a60b5a7f4349ae38ba5.jpg&w=100&h=-1&v=202f8241d0&r=1", "陈水扁戒护就医结束 医生:血块不是恶性肿瘤", "2012-05-23 15:03:00", "资料图:陈水扁。中新网5月23日电据台湾“中广新闻”报道,陈水扁今天(23日)前往林口长庚医院戒护就医,在中午诊疗结束,随后戒护返回台北监狱,受委托前往关心的台大医院柯文哲医生表示,有一些心血管阻塞的现象,不过还没有到临床上有生"));
		entities.add(new RenderEntitiy2("", "广东广电局副局长:广电总局从来没有发过限娱令", "2012-05-23 15:55:37", "羊城晚报讯记者刘玮宁、通讯员陈燕舒、实习生秦雪星报道:22日上午,记者从广东省广电局上线省政风行风热线节目“民声热线”中了解到,2011年,广东省广播电影电视局受理观众对在境外电视节目中违规插播广告的投诉有253件。对此,有关负责人表示"));
		entities.add(new RenderEntitiy2("http://res01.mimg.ifeng.com/g?url=http://y3.ifengimg.com/7b28ede2da65d6e2/2012/0523/ori_4fbc9c0a5dcfd.jpeg&w=100&h=-1&v=15d34ccc55&r=1", "专家:水中含雌激素不奇怪 没必要担心", "2012-05-23 16:14:48", "漫画/陈春鸣据新华社电日前,一条称“自来水中含有避孕药”的微博引起网民热议。相关领域专家告诉记者,所谓“避孕药”的说法实属噱头,其实准确的说法应该是水里检测出雌激素成分。据专家解释,在合格水质下,雌激素的含量比较微量,不会对"));
		entities.add(new RenderEntitiy2("", "长江流域进入汛期 海事部门严防船舶触礁搁浅", "2012-05-23 12:04:00", "宜昌港停泊囤船巳加长“跳船”应对水位上涨。 望作信 摄中新网宜昌5月23日电(望作信李麟)受近期长江流域连续强降雨和上游及各支流来水增多的双重影响,长江重庆至上海,各主要港口相继告别枯水位,长江干线结束长达七个月的枯水期,长江流"));
		entities.add(new RenderEntitiy2("http://res01.mimg.ifeng.com/g?url=http://y1.ifengimg.com/news_spider/dci_2012/05/df48952462d1797b0b45decef5a9c7fd.jpg&w=100&h=-1&v=557e2dbaa2&r=1", "英一硕士投简历逾万次未果 背广告牌推销自己", "2012-05-23 14:41:46", "英国硕士罗宾·诺顿背广告牌推销自己(网页截图)  国际在线专稿:据英国《每日邮报》5月22日报道,英国一位硕士过去十年间投简历1.5万份,但却没有找到一份全职工作。他目前整天背着广告牌沿着公路行走,希望能够找到工作。这名硕士叫"));
		entities.add(new RenderEntitiy2("", "张弛:“是中国人就转”的话语困境", "2012-05-23 13:57:42", "网上总有一些话,能让人看后长吁短叹又忍俊不禁,比如出镜率极高的“是中国人的就转”,又或者是它的孪生兄弟“不转不是中国人”。每每看到这句话,我在未点击鼠标左键之后都要掏出身份证来确认一下,看看它背后的“中华人民共和国”会不会易名改姓。只是"));
		entities.add(new RenderEntitiy2("", "以色列防长称以仍未排除军事打击伊朗可能性", "2012-05-23 13:57:00", "中新网5月23日电据外媒报道,以色列国防部长巴拉克23日表示,伊朗与国际原子能机构达成的开放核设施的初步协议,并不能让以色列排除军事打击伊朗的可能。巴拉克说,他对伊朗与国际原子能机构达成的这一初步协议“持怀疑态度”,认为这一协议不过是伊"));
		entities.add(new RenderEntitiy2("http://res01.mimg.ifeng.com/g?url=http://y1.ifengimg.com/1b0c4ed4543066da/2012/0523/ori_4fbc5737d7df0.jpeg&w=100&h=-1&v=6a6263212f&r=1", "李克峰:那一年,我读列夫·托尔斯泰", "2012-05-23 11:20:33", "1983年,我是学生,托尔斯泰是书架上的藏书。当时,没有酒吧、歌舞厅和洗脚城。从军队或农村回京的青年,骑自行车到消息灵通人士家里泡着,谈“人家美国……”,那叫沙龙。大家可以拎着烧开水的大铝壶,到饭馆去打1块4毛钱1斤的散装啤酒喝,但"));
		entities.add(new RenderEntitiy2("", "印度一公交车冲进恒河致26人死亡 系超载失控", "2012-05-23 15:19:00", "中新网5月23日电据外媒报道,印度警方透露,一辆公交车当地时间22日晚间冲进恒河,造成26人死亡,另有4人受重伤。救援人员已经在河中工作超过4个小时搜寻失踪者以及遇难者遗体。当地警方透露,这辆公交车载有45人,在开往圣城里希盖什的路"));
		entities.add(new RenderEntitiy2("", "奥巴马称卡梅伦在北约峰会期间曾偷溜外出观光", "2012-05-23 13:05:58", "5月21日,美国总统奥巴马(前右)和英国首相卡梅伦(前左)出席北约峰会阿富汗会议(新华社)国际在线专稿:据英国《每日邮报》5月22日报道,美国总统奥巴马(BarackObama)日前曝光称,英国首相卡梅伦(DavidCamero"));
		entities.add(new RenderEntitiy2("http://res01.mimg.ifeng.com/g?url=http://y0.ifengimg.com/news_spider/dci_2012/05/8baed005fac3fc57d07354a5101d2a7f.jpg&w=100&h=-1&v=e702ebc3b4&r=1", "伦敦奥运门票即将开售 开幕式最高票价2012英镑", "2012-05-23 13:38:00", "伦敦奥运门票图样(图片来源:黑龙江日报)中广网北京5月22日消息据中国之声《全球华语广播网》报道,因为是在本土举办,英国人今年看奥运的热情空前高涨。不过,伦敦奥运会的门票现在是又贵又难买,看开幕式最贵门票合人民币2万多,要知道4年"));
		return entities;
	}
}

 


 
没有用Adapter,就出来了一个简易的列表噢.

分享到:
评论
2 楼 sd6733531 2012-08-02  
yava555 写道
代码写得不错呀,具体细节还没看明白。类名,方法名和变量名起得都不错,见名知意,很恰当。

承蒙yava哥夸奖。。
1 楼 yava555 2012-08-01  
代码写得不错呀,具体细节还没看明白。类名,方法名和变量名起得都不错,见名知意,很恰当。

相关推荐

    原型设计软件【AxureRP】快速原型设计工具

    原型设计软件【AxureRP】快速原型设计工具原型设计软件【AxureRP】快速原型设计工具原型设计软件【AxureRP】快速原型设计工具原型设计软件【AxureRP】快速原型设计工具原型设计软件【AxureRP】快速原型设计工具原型...

    员工自助系统原型框架

    "员工自助系统原型框架"是一种高效的设计方法,用于构建企业内部的自助服务平台,旨在提高员工的工作效率和服务体验。系统原型是设计过程中的一个重要阶段,它允许开发者和需求方在实际编码之前,通过可视化的方式...

    android原型设计工具

    “android原型设计工具”可能包含各种设计模板、组件库、教程或者案例研究,这些资源能够帮助初学者快速上手,提升设计效率。 综上所述,选择合适的Android原型设计工具并掌握其使用技巧,是构建出色Android应用的...

    PitchBlade:PHP 5.4+ 快速原型框架

    因为我厌倦了在创建原型时重写和/或复制/粘贴代码。 我们真的需要另一个该死的框架吗? 不,我们真的没有。 请不要制作另一个该死的框架。 但是但是你说... 是的,我做到了。 问完了吗? 执照

    re RP 快速原型制作软件

    re RP 快速原型制作软件,由美国Axure Software Solutions, Inc.公司开发。 ,RP 是 Rapid Prototyping (快速原型缩写) 。Axure (ak shûr) 音标:(本页面即是由Axure RP输出的Html原型) Axure RP 能让操作它的人...

    simulink的xPCTarget实现实时快速原型和硬件在回路的仿真-xPC-Target——在PC平台上实现实时快速原型和硬件在回路的仿真.doc

    xPC Target是MATLAB工具箱中的一个重要组成部分,主要用于在个人计算机(PC)平台上实现实时快速原型和硬件在回路(HIL)仿真。这个强大的工具允许工程师和科学家们使用Simulink和Stateflow模型,将复杂的控制系统...

    一个高保真android交互原型

    它允许设计师通过拖放组件、创建动态面板、设置交互规则等方式快速构建原型。此外,Axure还支持生成规范的线框图、流程图和交互文档,方便团队协作和沟通。 在设计Android交互原型时,有几点需要注意: 1. **遵循...

    axure快速原型工具

    Axure RP是一款广泛应用于IT行业的快速原型工具,尤其在网页设计和用户体验(UX)领域备受推崇。它以其直观易用的界面和强大的功能,使得设计师能够迅速构建出交互式的网页原型,大大提升了产品设计的效率。 一、...

    快速原型制造技术与直接金属成型

    快速原型制造技术简称RP技术,是一种将计算机辅助设计(CAD)生成的三维模型数据直接转化为具有一定结构和功能的原型的技术。它在产品开发、工程设计、模具制造等领域具有极其重要的应用价值。直接金属成型(DMD)是...

    上下文原型框架

    "上下文原型框架"是一种专为面向切面编程(AOP)设计的框架,它着重于提供上下文管理和原型实例化的能力。在AOP中,上下文(Context)扮演着核心角色,它负责存储和管理对象,同时也为对象间通信提供了一个容器。此...

    android设计模式之原型模式

    例如,当我们需要保存和恢复Activity的状态时,可以使用原型模式复制当前界面的状态,然后在恢复时快速重建。另一个例子是在配置多个相似的ListView或RecyclerView时,可以先创建一个基础配置,然后通过复制和微调...

    快速原型案例分析集锦(下).zip

    1. **系统架构设计**:快速原型帮助工程师快速构建初步的硬件和软件框架,验证不同组件的协同工作。 2. **传感器测试**:通过快速原型,可以迅速评估不同类型的传感器(如激光雷达、摄像头、毫米波雷达等)的性能和...

    android所有的界面原型

    NULL 博文链接:https://hongtaq.iteye.com/blog/1404752

    快速原型法(层次、优点等)

    快速原型法,作为一种创新的软件开发方法,旨在通过构建可迭代的系统模型,与用户密切合作,以确保最终产品能够准确地满足用户需求。这种方法的核心在于“快”和“迭代”,强调在系统开发的早期阶段就让用户体验和...

    android交互原型

    在IT行业中,交互原型设计是开发高质量移动应用的关键步骤之一,尤其在Android平台上。"Android交互原型"是指针对Android操作系统设计的用户界面交互模型,它主要用于预览、测试和优化用户体验。在这个过程中,设计...

    01.AxureUX中后台管理信息系统通用原型设计方案 v2(系统框架+页面模板).rp

    01.AxureUX中后台管理信息系统通用原型设计方案 v2(系统框架+页面模板).rp 01.AxureUX中后台管理信息系统通用原型设计方案 v2(系统框架+页面模板).rp 01.AxureUX中后台管理信息系统通用原型设计方案 v2(系统框架+...

    《Axure快速原型设计》电子书2

    《Axure快速原型设计》电子书只用于学习,详细介绍Axure软件原型设计,适合于产品经理、需求调研分析人员使用,可输出对应的开发设计文档。

    两个 axure android 组件库 原型控件

    标题提到的“两个axure android组件库原型控件”正是这样的资源,它们包含了多种与Android界面设计相符的预定义元件,方便用户快速搭建界面。 `android widget by YEFAN.rplib`和`Mobile-android_DSK.rplib`是两个...

    Axure后台管理系统框架原型模板

    Axure后台管理系统框架原型模板正是基于这样的理念设计,通过预设的组件和交互,帮助设计师快速构建出符合实际需求的后台系统框架。 三、高保真原型 高保真原型是指尽可能接近最终产品的原型设计,它包含了详细的...

    后台管理框架axure原型模板

    在这个“后台管理框架axure原型模板”中,我们可以预见到一系列精心设计的页面和组件,帮助设计师和开发者快速搭建后台界面。 1. **Axure介绍**:Axure RP是美国Axure Software Solution公司开发的一款原型设计工具...

Global site tag (gtag.js) - Google Analytics