android butterknife zelezny 怎么使用
使用方式:导入Butterknife的jar包,不需要修改配置文件添加AndroidStudio插件(可选,需要依赖ButterKnife的jar包)下载一个插件Android ButterKnife Zelezny来配合Butterknife自动生成View。注意,需要绑定的View或者资源的声明必须是public,不能是private或者staticAndroidAnnotation(AA)与ButterKnife的比较,AA的分析如果没看的话建议先读一下老衲的上一篇AA注解的介绍与流程分析首先从功能上来说,AA提供的注解数量远多于ButterKnife,功能也是无所不包(View的绑定,线程,监听,动画,balabala...)而ButterKnife仅仅提供针对View的注解。其次从两类框架的实现流程上来说,AA在一开始就已经生成了新的代码XXXActivity_,后续的执行都是依赖于新的代码。生成的方法和代码量较多。ButterKnife在编译时也是会生成新的中间工具类,代码量相对于AA来说略少,但是新增了类文件。并且,在运行时,需要通过一点点反射的技术来实现整体的逻辑。第三,从上手成都上来说,AA的前期工作略麻烦一些,并且后期需要手动修改类名(XXX的后面加上下划线)ButterKnife则需要在类中添加ButterKnife.Bind方法来使用绑定功能。AA稍微麻烦一丢丢。
android studio怎么一键注解butterknifey
方法/步骤1:导入插件
1
点击“File”文件,选择“Project Structrue……”,如图:
2
点击左侧栏的“app”,然后点击顶部导航的“Dependencies”,最后点击“加号”,如图:
3
点击“加号”后,会出现三个选项,选择第一个(添加第三方库),如图:
4
输入,“butterknife”,点击搜索按钮,如图:
5
选择“com.jakewharton:butterknife:8.1.0”,点击“OK”,如图:
6
这时我们可以看到“Dependencies”中增加了一个,“com.jakewharton:butterknife:8.1.0”,点击“OK”按钮,如图:
7
这时看到,app文件夹下的“build.gradle”文件中,"dependencies"下增加了“compile 'com.jakewharton:butterknife:8.1.0'”,然后就是少许的等待,如图:
8
此时打开project下的“build.gradle”,然后在"dependencies"下增加了“classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'”,如图:
9
此
时在打开app文件夹下的“build.gradle”,添加“apply plugin: 'android-apt'”,“apt
'com.jakewharton:butterknife-compiler:8.1.0'”,然后点击“Sync Now”,如图:
10
此时引用成功,现在开始使用吧.
END
方法/步骤:使用方法
写XML布局文件,把要想初始化的控件,都加上ID
将鼠标移到代码中的布局的位置,摁快捷键“Alt+Insert”弹出对话框,点击“Generate ButterKnife Injections”,如图:
弹出对话框,看看是不是自己需要的控件,点击“Confirm”,如图:
完成后看到代码,如图:
Fragment使用结果如图:
butterknife 在界面销毁的时候怎样处理的
使用方式:导入Butterknife的jar包,不需要修改配置文件添加AndroidStudio插件(可选,需要依赖ButterKnife的jar包)下载一个插件Android ButterKnife Zelezny来配合Butterknife自动生成View。注意,需要绑定的View或者资源的声明必须是public,不能是private或者staticAndroidAnnotation(AA)与ButterKnife的比较,AA的分析如果没看的话建议先读一下老衲的上一篇AA注解的介绍与流程分析首先从功能上来说,AA提供的注解数量远多于ButterKnife,功能也是无所不包(View的绑定,线程,监听,动画,balabala...)而ButterKnife仅仅提供针对View的注解。其次从两类框架的实现流程上来说,AA在一开始就已经生成了新的代码XXXActivity_,后续的执行都是依赖于新的代码。生成的方法和代码量较多。ButterKnife在编译时也是会生成新的中间工具类,代码量相对于AA来说略少,但是新增了类文件。并且,在运行时,需要通过一点点反射的技术来实现整体的逻辑。第三,从上手成都上来说,AA的前期工作略麻烦一些,并且后期需要手动修改类名(XXX的后面加上下划线)ButterKnife则需要在类中添加ButterKnife.Bind方法来使用绑定功能。AA稍微麻烦一丢丢。
为什么ButterKnife.bind之后View依然为null
如果的ButterKnife是8.01或者以上的话,你可这样试一下:
1、在项目下的build.gradle中的dependencies下配置 classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
2、在app中的build.gradle中顶行加入apply plugin: 'com.neenbedankt.android-apt'
在dependencies中加入compile 'com.jakewharton:butterknife:8.2.1' 和
apt 'com.jakewharton:butterknife-compiler:8.2.1' 当然你你要注意一下你的butterknife的版本号。
注意,使用butterknife的时候,@bind(R.id.xxx)标记的变量修饰符不能为private或static。
父activity已经butterknife绑定子fragment还要绑定吗
在Fragment的onCreateView里面 @Override View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fancy_fragment, container, false);
ButterKnife.inject(this, view);
// TODO Use "injected" views...
return view;
}
这样初始化。其他的和Activity用法一样。
西餐刀叉摆放
【西餐礼仪-没吃完,刀叉不能并排放】刀叉在盘子上放成汉字的八字,刀刃朝内,不能朝外,叉子是弓朝上,齿朝下。这就是告诉服务生和别人,我这个菜没吃完。千万不要把它并排放,如果刀叉并排,刀刃朝内,叉齿朝上,代表的意思就是不吃了,收掉【西餐刀叉使用礼仪】1.右手持刀或汤匙,左手拿叉。2.两把以上,应由最外依次向内取用。3.刀叉轻握尾端,食指按在柄上。4.汤匙则用握笔的方式拿。5.如果觉不方便,可换右手拿叉,但更换频繁则显粗野。6.吃较大的蔬菜,可用刀叉来折叠、分切。7.软食物可放在叉子平面上,用刀子整理一下!
android 开发框架有哪些
主要总结了7个好用的android 开发框架推荐给你:
一、 Afinal
Afinal是一个Android的ioc,orm框架,内置了四大模块功能:FinalAcitivity,FinalBitmap,FinalDb,FinalHttp。通过finalActivity,我们可以通过注解的方式进行绑定ui和事件。通过finalBitmap,我们可以方便的加载bitmap图片,而无需考虑oom等问题。通过finalDB模块,我们一行代码就可以对android的sqlite数据库进行增删改查。通过FinalHttp模块,我们可以以ajax形式请求http数据。
功能:
一个android的ioc,orm框架,内置了四大模块功能:FinalAcitivity,FinalBitmap,FinalDb,FinalHttp。通过finalActivity,我们可以通过注解的方式进行绑定ui和事件。通过finalBitmap,我们可以方便的加载bitmap图片,而无需考虑oom等问题。通过finalDB模块,我们一行代码就可以对android的sqlite数据库进行增删改查。通过FinalHttp模块,我们可以以ajax形式请求http数据。
优点:功能比较全面,文档完善,代码效率比较高。
缺点:没有项目demo,框架的时间比较久,代码冗余比较多(这也是无可避免的),文档比较老跟不上代码更新进度。
二、 xUtils
xUtils:可以说是Afinal的升级版。
xUtils 包含了很多实用的android工具。
xUtils 支持大文件上传,更全面的http请求协议支持(10种谓词),拥有更加灵活的ORM,更多的事件注解支持且不受混淆影响...
xUitls 最低兼容android 2.2 (api level 8)
三、 ThinkAndroid
ThinkAndroid是一个免费的开源的、简易的、遵循Apache2开源协议发布的Android开发框架,其开发宗旨是简单、快速的进行Android应用程序的开发,包含Android
mvc、简易sqlite orm、ioc模块、封装Android
httpclitent的http模块,具有快速构建文件缓存功能,无需考虑缓存文件的格式,都可以非常轻松的实现缓存,它还基于文件缓存模块实现了图片缓存功能,在android中加载的图片的时候,对oom的问题,和对加载图片错位的问题都轻易解决。他还包括了一个手机开发中经常应用的实用工具类,如日志管理,配置文件管理,android下载器模块,网络切换检测等等工具
四、 LoonAndroid
如果你想看ui方面的东西,这里没有,想要看牛逼的效果这里也没有。这只是纯实现功能的框架,它的目标是节省代码量,降低耦合,让代码层次看起来更清晰。整个框架一部分是网上的,一部分是我改的,为了适应我的编码习惯,还有一部分像orm完全是网上的组件。在此感谢那些朋友们。
整个框架式的初衷是为了偷懒,之前都是一个功能一个jar,做项目的时候拉进去,这样对于我来说依然还是比较麻烦。最后就导致我把所有的jar做成了一个工具集合包。
有很多框架都含有这个工具集合里的功能,这些不一定都好用,因为这是根据我个人使用喜欢来实现的,如果你们有自己的想法,可以自己把架包解压了以后,源码拉出来改动下。
目前很多框架都用到了注解,除了androidannotations没有入侵我们应用的代码以外,其他的基本上都有,要么是必须继承框架里面的activity,要么是必须在activity的oncreat里面调用某个方法。
整个框架式不同于androidannotations,Roboguice等ioc框架,这是一个类似spring的实现方式。在整应用的生命周期中找到切入点,然后对activity的生命周期进行拦截,然后插入自己的功能。
五、 KJFrameForAndroid
KJFrameForAndroid 又叫KJLibrary,是一个android的orm 和 ioc
框架。同时封装了android中的Bitmap与Http操作的框架,使其更加简单易用;
KJFrameForAndroid的设计思想是通过封装Android原生SDK中复杂的复杂操作而达到简化Android应用级开发,最终实现快速而又安全的开发APP。我们提倡用最少的代码,完成最多的操作,用最高的效率,完成最复杂的功能。
功能:
一个android的orm 和 ioc 框架。同时封装了android中的Bitmap与Http操作的框架,使其更加简单易用;
KJFrameForAndroid开发框架的设计思想是通过封装Android原生SDK中复杂的复杂操作而达到简化Android应用级开发,最终实现快速而又安全的开发APP。总共分为五大模块:UILibrary,UtilsLibrary,HttpLibrary,BitmapLibrary,DBLibrary。
六、 dhroid
dhroid 是基于android 平台,
极速开发框架,其核心设计目标是开发迅速、代码量少、学习简单、功能强大、轻量级、易扩展.使你更快,更好的开发商业级别应用
功能:
1.Ioc容器: (用过spring的都知道)视图注入,对象注入,接口注入,解决类依赖关系
2.Eventbus: android平台事件总线框架,独创延时事件,事件管理轻松
3.Dhnet: 网络http请求的解决方案,使用简单,减少代码,自带多种网络访问缓存策略
4.adapter模块: 数据绑定轻松,不用写多余的adapter,天生网络支持(一行代码搞定加载,刷新问题)
5.DhDb: android中sqlite的最轻量orm框架(增删改查轻松搞定)
6.Perference: android自带Perference 升级版,让你的Perference更强大,更方便
工具集合 JSONUtil(安全处理json),ViewUtil(数据绑定更快) ThreadWorker(异步任务工具)...
七、 SmartAndroid
SmartAndroid是一套给
Android开发者使用的应用程序开发框架和工具包。它提供一套丰富的标准库以及简单的接口和逻辑结构,其目的是使开发人员更快速地进行项目开发。使用
SmartAndroid可以减少代码的编写量,并将你的精力投入到项目的创造性开发上。
功能:
SmartAndroid 拥有全范围的类库,可以完成大多数通常需要的APP开发任务,包括:
异步网络操作相关所有功能、强大的图片处理操作、轻量级ORM数据库Sqlite库、zip操作
、动画特效、Html等解析采集、事件总线EventBus/Otto、Gson(Json)、AQuery、主流所有UI控件(例如:ActionbarSherlock,SlidingMenu,BottomView,Actionbar,DragListView等10多种UI库)等。
android 开发框架有哪些
一.认识android的架构Android其本质就是在标准的Linux系统上增加了Java虚拟机Dalvik,并在Dalvik虚拟机上搭建了一个JAVA的applicationframework,所有的应用程序都是基于JAVA的applicationframework之上。android分为四个层,从高层到低层分别是应用程序层、应用程序框架层、系统运行库层和linux核心层。二.搭建环境搭建开发环境对国内的开发者来说最痛苦的是无法去访问android开发网站。为了更好的认识世界,对程序员来说,会翻墙也是的一门技术,带你去领略墙外的世界,好了,不废话了,国内开发者访问(androiddevtools)上面已经有了所有你要的资源,同时可以下载到我们的主角framework但是这样的搭建只能去阅读源代码,我们无法去更进一步去实现自己的rom,我们看到锤子的系统在早期的开放rom是自己从新实现了framework的代码,现在看起来他成功了,所以我们还要去搭建android系统的源码编译环境。搭建源码编译环境http://www.cnblogs.com/bluestorm/p/4419135.htmlhttps://source.android.com/source/downloading.html(这里详细的介绍了如何下载编译)三.开始主题在一开始写c程序的时候都有一个运行的入口,比如#include#include#includeusingnamespacestd;//这里的main就是应用的入口intmain(intargc,constchar*argv[]){return0;}在计算机网络原理中我们用socket实现一个服务器端,不断的接听客户端的访问,而且他的代码是这样实现的:#include#pragmacomment(lib,"WS2_32.lib")#includevoidmain(){WORDwVersionRequested;//版本号WSADATAwsaData;interr;wVersionRequested=MAKEWORD(2,2);//2.2版本的套接字//加载套接字库,如果失败返回err=WSAStartup(wVersionRequested,&wsaData);if(err!=0){return;}//判断高低字节是不是2,如果不是2.2的版本则退出if(LOBYTE(wsaData.wVersion)!=2||HIBYTE(wsaData.wVersion)!=2){return;}//创建流式套接字,基于TCP(SOCK_STREAM)SOCKETsocSrv=socket(AF_INET,SOCK_STREAM,0);//Socket地址结构体的创建SOCKADDR_INaddrSrv;addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//转换Unsignedlong型为网络字节序格addrSrv.sin_family=AF_INET;//指定地址簇addrSrv.sin_port=htons(6000);//指定端口号,除sin_family参数外,其它参数都是网络字节序,因此需要转换//将套接字绑定到一个端口号和本地地址上bind(socSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));//必须用sizeof,strlen不行listen(socSrv,5);SOCKADDR_INaddrClient;//字义用来接收客户端Socket的结构体intlen=sizeof(SOCKADDR);//初始化参数,这个参数必须进行初始化,sizeof//循环等待接受客户端发送请求while(1){//等待客户请求到来;当请求到来后,接受连接请求,//返回一个新的对应于此次连接的套接字(accept)。//此时程序在此发生阻塞SOCKETsockConn=accept(socSrv,(SOCKADDR*)&addrClient,&len);charsendBuf[100];sprintf(sendBuf,"Welcome%stoJoyChou",inet_ntoa(addrClient.sin_addr));//格式化输出//用返回的套接字和客户端进行通信send(sockConn,sendBuf,strlen(sendBuf)+1,0);//多发送一个字节//接收数据charrecvBuf[100];recv(sockConn,recvBuf,100,0);printf("%s\\n",recvBuf);closesocket(sockConn);}}他采用了一个while死循环去监听客户端的请求。在一遍啰嗦之后,主角终于闪亮的登场了。先上源代码publicfinalclassActivityThread{publicstaticvoidmain(String[]args){SamplingProfilerIntegration.start();CloseGuard.setEnabled(false);Environment.initForCurrentUser();EventLogger.setReporter(newEventLoggingReporter());Security.addProvider(newAndroidKeyStoreProvider());finalFileconfigDir=Environment.getUserConfigDirectory(UserHandle.myUserId());TrustedCertificateStore.setDefaultUserDirectory(configDir);Process.setArgV0("");Looper.prepareMainLooper();//从中可以看到为app开辟了一个线程进入了looper之中ActivityThreadthread=newActivityThread();thread.attach(false);if(sMainThreadHandler==null){sMainThreadHandler=thread.getHandler();}AsyncTask.init();if(false){Looper.myLooper().setMessageLogging(newLogPrinter(Log.DEBUG,"ActivityThread"));}Looper.loop();thrownewRuntimeException("Mainthreadloopunexpectedlyexited");}}看到源码失望了,没有一个while循环啊,其实用了他方法实现//用一个looper的机制循环监听响应Looper.prepareMainLooper();Looper.loop();进一步深入代码publicstaticvoidloop(){finalLooperme=myLooper();if(me==null){thrownewRuntimeException("NoLooper;Looper.prepare()wasn'tcalledonthisthread.");}finalMessageQueuequeue=me.mQueue;Binder.clearCallingIdentity();finallongident=Binder.clearCallingIdentity();//在这里看到了一个循环监听消息for(;;){Messagemsg=queue.next();//mightblockif(msg==null){//Nomessageindicatesthatthemessagequeueisquitting.return;}Printerlogging=me.mLogging;if(logging!=null){logging.println(">>>>>Dispatchingto"+msg.target+""+msg.callback+":"+msg.what);}msg.target.dispatchMessage(msg);if(logging!=null){logging.println("<<<<<Finishedto"+msg.target+""+msg.callback);}//Makesurethatduringthecourseofdispatchingthe//identityofthethreadwasn'tcorrupted.finallongnewIdent=Binder.clearCallingIdentity();if(ident!=newIdent){Log.wtf(TAG,"Threadidentitychangedfrom0x"+Long.toHexString(ident)+"to0x"+Long.toHexString(newIdent)+"whiledispatchingto"+msg.target.getClass().getName()+""+msg.callback+"what="+msg.what);}msg.recycleUnchecked();}}