程序员常去的14个顶级开发社区

![](http://www.cocoachina.com/cms/uploads/allimg/140825/4196_140825091916_1.jpg) (via:[码农网](http://www.codeceo.com/article/14-communities-programmer-go.html)) 作为程序员,选择好合适的开发社区对提高自己的编程能力会有很大的帮助,我也说不出为什么,但是一些优秀的实时开发社区确实能帮你积累不少开发经验。 下面这张图列出了14个程序员经常逛的顶级开发社区,作为程序员,你应该要了解其中一个或者最好是多个,并且学会使用它们,利用里面的资源提高自己的编程能力。 ![](http://www.cocoachina.com/cms/uploads/allimg/140825/4196_140825091956_1.png) **我们期望在开发者社区中获得什么?** 我们希望能得到切实的帮助,而不是获取一些唠叨的废话或者一些水文。我们希望能根据自己提出的问题来获得其他开发者的回答帮助或者讨论一些学习资源的问题。下图是一些开发者在社区中最关注的一些问题。 ![](http://www.cocoachina.com/cms/uploads/allimg/140825/4196_140825092021_1.png) 下面我们来看一下程序员经常去的14个顶级开发者社区,如果你还不知道它们,那么赶紧去看看,也许会有意想不到的收获。 [**Stack Overflow**](http://stackoverflow.com/) 9月份,Stack Overflow也将迎来其6岁的生日,毫无疑问,Stack Overflow是全球最受程序员欢迎的开发社区,而且也是内容最丰富的社区之一。 ![](http://www.cocoachina.com/cms/uploads/allimg/140825/4196_140825092045_1.png) [**Reddit**](http://www.reddit.com/r/programming) reddit也是一个非常富有个性的社区,你可以在reddit上提交一些感兴趣的话题,也可以和其他程序员讨论一些编程开发的问题和当前的IT热点资讯,reddit是一个用户粘性比较强的开放社区,编程开发板块只是其中的一小部分。 ![](http://www.cocoachina.com/cms/uploads/allimg/140825/4196_140825092058_1.png) [**Google+ Communities**](https://plus.google.com/communities) 加入Google+社区只需要一个Google账户即可,你可以完全免费的获取里面的资源。 ![](http://www.cocoachina.com/cms/uploads/allimg/140825/4196_140825092214_1.png) [**SitePoint**](http://www.sitepoint.com/forums/) SitePoint社区论坛也是我最喜欢的在线开发社区和程序员设计师家园之一,SitePoint主要目标是帮助初学者了解其选择的编程语言和技术,并且得到相应的提高,网站内容包括web开发、web设计、技术写作以及用户体验等。 ![](http://www.cocoachina.com/cms/uploads/allimg/140825/4196_140825092230_1.png) [**CodeProject**](http://www.codeproject.com/) 截止2013年8月,已经有100多万用户入驻codeproject,并且分享了约100多万个代码演示,在codeproject里,你可以将代码分享给你的朋友们。和其他社区不同的是,codeproject更加侧重软件开发,比如C, C#, C++, Java, Lisp等开发。 ![](http://www.cocoachina.com/cms/uploads/allimg/140825/4196_140825092244_1.png) [**Treehouse**](https://teamtreehouse.com/forum) 在寻找一个实惠的编程学习途径吗?你可以试试加入treehouse,它并不昂贵,年度会员还可以打折优惠。treehouse非常简单,你可以在上面找到各种等级的问题答案。 ![](http://www.cocoachina.com/cms/uploads/allimg/140825/4196_140825092303_1.png) [**Hacker News**](https://news.ycombinator.com/news) Hacker News这个名字已经刻在很多开发者心里了,在这里,可以实时看到编程界中发生的任何事情,包括一些学习的资源和教程。你可以从用户提交的数据中找到适合你的学习资源,比如文章、图像视频以及一些问题的讨论。 ![](http://www.cocoachina.com/cms/uploads/allimg/140825/4196_140825092320_1.png) [**DZone**](http://www.dzone.com/links/index.html) DZone是一个允许用户分享最新IT新闻和编程资源的社区,这是一个文章内容驱动的社区,所以需要许多内容管理员来把关文章的质量,从某种意义上说,它与HN和其他的编程社区类似,但是这个平台时间最长,里面的用户数量也是最多的。 ![](http://www.cocoachina.com/cms/uploads/allimg/140825/4196_140825092333_1.png) [**Bytes**](http://bytes.com/) Bytes是一个传统的开发社区,新手和专家都可以在里面讨论一些关于软件开发、数据库开发以及网络和系统管理的问题。数据库、网络以及系统是编程的基础,我们需要关注这方面的问题,从而能更好的帮助我们提高编程能力。 ![](http://www.cocoachina.com/cms/uploads/allimg/140825/4196_140825092347_1.png) [**DaniWeb**](http://www.daniweb.com/) DaniWeb以前是专为市场营销业务分析人员设计的,但是现在主要为各个年龄段的Web开发者和程序员服务。 ![](http://www.cocoachina.com/cms/uploads/allimg/140825/4196_140825092358_1.png) [**Dream In Code**](http://www.dreamincode.net/forums/) 这几年,它的更新比较缓慢了,这有好的一面也有坏的一面,60w的用户以及百万及的文章,内容涵盖 Java, C++, VB.NET等,学习资源相当丰富。 ![](http://www.cocoachina.com/cms/uploads/allimg/140825/4196_140825092413_1.png) [**Tech.Pro**](http://tech.pro/) Tech.pro是一个关注科技领域发展的相关资讯的社区,Tech.pro是一个获取资源和教程的入门网站,包含一些技术教程、讨论、博客已经链接等。 ![](http://www.cocoachina.com/cms/uploads/allimg/140825/4196_140825092424_1.png) [**Pineapple**](http://pineapple.io/) 也许这还算不上活跃的优秀开发社区,但是这里也包含很多有用的工具、教程以及类库资源等。我在几个月前开始使用Pineapple,现在已经比较依赖它了。 ![](http://www.cocoachina.com/cms/uploads/allimg/140825/4196_140825092439_1.png) [**Lobsters**](https://lobste.rs/) 这是一个用户邀请制的开发社区,是一个真正“面向社交”的社区,你可以在里面找到大量的关于编程的任何讨论,很多信息都至少有20多条回帖,这些信息或许对你会有很大帮助。 ![](http://www.cocoachina.com/cms/uploads/allimg/140825/4196_140825092451_1.png)

2014年8月31日 · 1 分钟 · 天边的星星

常用公共DNS服务器地址

DNS,全称Domain Name System,即域名解析系统,帮助用户在互联网上寻找路径,它在互联网的作用是把域名转换成为网络可以识别的IP地址。目前国内电信运营商通过使用DNS劫持和DNS污染的方法,干扰用户正常上网,使得用户无法访问众多国外常用服务,因此今天我介绍一些国内外的DNS服务器地址,供大家选择使用。 国外DNS服务器地址 Google Public DNS (8.8.8.8, 8.8.4.4) OpenDNS (208.67.222.222, 208.67.220.220) OpenDNS Family (208.67.222.123, 208.67.220.123) V2EX DNS (199.91.73.222;178.79.131.110) Comodo Secure (8.26.56.26, 8.20.247.20) UltraDNS (156.154.70.1, 156.154.71.1) Norton ConnectSafe (199.85.126.10, 199.85.127.10) 国内DNS服务器地址 OneDNS (112.124.47.27) OpenerDNS(42.120.21.30) aliDNS (223.5.5.5, 223.6.6.6) 114DNS (114.114.114.114, 114.114.115.115) 114DNS安全版 (114.114.114.119, 114.114.115.119) 114DNS家庭版 (114.114.114.110, 114.114.115.110) <div> http://www.freevpnmac.com/macvpn/ ![](file:///C:\Users\ADMINI~1\AppData\Local\Temp\%W@GJ$ACOF(TYDYECOKVDYB.png)https://code.google.com/p/smarthosts/ ![](file:///C:\Users\ADMINI~1\AppData\Local\Temp\%W@GJ$ACOF(TYDYECOKVDYB.png)http://www.vpngate.net/cn/</div> <div> http://technet.microsoft.com/en-us/library/ms525732(VS.90).aspx </div>

2014年8月5日 · 1 分钟 · 天边的星星

开源力量新版在线学习网站开通啦!

开源力量新版在线学习网站开通啦! 我们同期开放了往期公开课的全部学习视频,在过去的一年里,55位技术大牛倾力奉献,超过1.8万人次共同参与了学习! 马上学习吧,可以有更多的时间学习了,不如现在就开始吧! 1.马万平 现任职于大型电信系统服务软件提供商讲“纠结中前行的配置管理 ” 学习视频:http://www.osforce.cn/course/60 2.邱剑 美团网技术部资深系统工程师讲“KVM虚拟机的性能优化” 学习视频:http://www.osforce.cn/course/77 3.章文嵩 阿里巴巴集团副总裁讲“拥抱开源,企业IT自主之路” 学习视频:http://www.osforce.cn/course/67 4.潘志彪 比特基金首席技术顾问讲“为什么比特币技术上是靠谱的” 学习视频:http://www.osforce.cn/course/86 5.Eric Linux内核华人贡献前10讲“Linux虚拟化技术” 学习视频:http://www.osforce.cn/course/91 6.Louis IBM Hadoop架构师讲“Hadoop大数据入门指引” 学习视频:http://www.osforce.cn/course/87 7.许智翔 python-segment和uniproxy的作者讲”Python入门指引“ 学习视频:http://www.osforce.cn/course/64 8.施懿民 知平软件创始人讲”生产环境下的Java排错调优“ 学习视频:http://www.osforce.cn/course/55 9.许式伟 七牛云存储CEO讲”Go语言入门“ 学习视频:http://www.osforce.cn/course/56 10.宋宝华 《Linux设备驱动开发详解》作者讲”move to Linux 3.x for ARM“ 学习视频:http://www.osforce.cn/course/58 11.鲁义明 开源项目 Gigah的维护人讲”跟我一起阅读Nginx源代码“ 学习视频:http://www.osforce.cn/course/59 12.马钧 开源软件爱好者和学习者讲”一起来学Scala“ 学习视频:http://www.osforce.cn/course/61 13.胡长城 盛大网络“Youni短信”技术总监讲“移动互联网研发团队的技术管理实践探讨” 学习视频:http://www.osforce.cn/course/63 14.莫华枫 盛大云存储技术负责人讲“云计算之对象存储的技术选择” 学习视频:http://www.osforce.cn/course/65 15.彭晨阳 Jdon.com自媒体主持人讲“Java事件编程” 学习视频:http://www.osforce.cn/course/66 16.祁宏 上海动量软件技术有限公司业务流程顾问讲“用开源软件构建App的高效服务端” 学习视频:http://www.osforce.cn/course/68 17.王伟 复旦视觉艺术新媒体学院教师讲“交互设计,不只是界面” 学习视频:http://www.osforce.cn/course/70 18.吴朱华 IBM中国研究院参与过多款云计算操作系统的开发工作讲“大数据的实时分析与应用案例分享” 学习视频 :http://www.osforce.cn/course/71 19.郭雄飞 景略半导体嵌入系统设计经理讲“一个小团队的敏捷项目管理实践” 学习视频:http://www.osforce.cn/course/72 20.华康强 微软认证程序开发专家, 微软认证讲师讲”Windows8应用开发概览“ 学习视频:http://www.osforce.cn/course/73 21.郭理靖 京东商城云平台开发者服务组高级经理讲“云开两朵,各表一枝–公、私有云架构异同点与难点” 学习视频:http://www.osforce.cn/course/74 22.陈沙克 IDC行业里从事云计算相关工作讲“跟我一起玩转OpenStack” 学习视频:http://www.osforce.cn/course/75 23.沈大海 移动互联网应用开发专家,开源技术讲师讲“教你用Cocos2D-X开发跨平台移动应用” 学习视频:http://www.osforce.cn/course/76 24.李皓 小米游戏运营中心技术总监讲“Think in Android” 学习视频:http://www.osforce.cn/course/78 25.谷瑞 RT-Thread内核开发成员讲“实时操作系统RT-Thread开发者专场” 学习视频:http://www.osforce.cn/course/79 26.李道兵 中文维基百科前管理员讲“HTTP协议相关的若干安全问题” 学习视频:http://www.osforce.cn/course/84 27.林鹏 当当网安全经理讲”网络安全渗透平台BackTrack5基础使用“ 学习视频:http://www.osforce.cn/course/85 28. 由开源力量、CSDN CODE和多个开源社区共同主办的“我们的开源项目”暨开源力量”开源力量公开课2013年度庆典“ 学习视频:http://www.osforce.cn/course/89 29.何晓阳 北京蓝海讯通科技有限公司CEO讲”应用性能管理的过去现在和未来“ 学习视频:http://www.osforce.cn/course/90 30.蔡书 红帽软件解决方案架构师讲”另辟蹊径,基于轻量虚拟化的PaaS平台–RedHat OpenShift“ 学习视频:http://www.osforce.cn/course/92 31.杨尚川 2013年度优秀开源项目APDPlat发起人,资深Nutch搜索引擎专家讲”Nutch:从搜索引擎到网络爬虫“ 学习视频:http://www.osforce.cn/course/93 32.张建锋 JBossAS Core Developer讲”JBoss应用服务器架构体系和JavaEE的技术变革之路“ 学习视频:http://www.osforce.cn/course/94 33.龙文选 黑鸭子中国首席专家讲”2013“我们的开源项目” 学习视频:http://www.osforce.cn/course/95 更多公开课,免费视频学习请关注官网:http://www.osforce.cn/ ...

2014年8月4日 · 1 分钟 · 天边的星星

windows hosts文件配置

Host文件目录C:\Windows\System32\drivers\etc # Copyright (c) 1993-2009 Microsoft Corp. # This is a sample HOSTS file used by Microsoft TCP/IP for Windows. # This file contains the mappings of IP addresses to host names. Each # entry should be kept on an individual line. The IP address should # be placed in the first column followed by the corresponding host name. # The IP address and the host name should be separated by at least one # space. ...

2014年8月3日 · 6 分钟 · 天边的星星

Android ActionBar完全解析,使用官方推荐的最佳导航栏(下)

转载:http://blog.csdn.net/guolin_blog/article/details/25466665 本篇文章主要内容来自于Android Doc,我翻译之后又做了些加工,英文好的朋友也可以直接去读原文。 http://developer.android.com/guide/topics/ui/actionbar.html 限于篇幅的原因,在上篇文章中我们只学习了ActionBar基础部分的知识,那么本篇文章我们将接着上一章的内容继续学习,探究一下ActionBar更加高级的知识。如果你还没有看过前面一篇文章的话,建议先去阅读Android ActionBar完全解析,使用官方推荐的最佳导航栏(上)。 添加Action Provider 和Action View有点类似,Action Provider也可以将一个Action按钮替换成一个自定义的布局。但不同的是,Action Provider能够完全控制事件的所有行为,并且还可以在点击的时候显示子菜单。 为了添加一个Action Provider,我们需要在标签中指定一个actionViewClass属性,在里面填入Action Provider的完整类名。我们可以通过继承ActionProvider类的方式来创建一个自己的Action Provider,同时,Android也提供好了几个内置的Action Provider,比如说ShareActionProvider。 由于每个Action Provider都可以自由地控制事件响应,所以它们不需要在onOptionsItemSelected()方法中再去监听点击事件,而是应该在onPerformDefaultAction()方法中去执行相应的逻辑。 那么我们就先来看一下ShareActionProvider的简单用法吧,编辑menu资源文件,在里面加入ShareActionProvider的声明,如下所示: **[html]** [view plain](http://blog.csdn.net/guolin_blog/article/details/25466665#)[copy](http://blog.csdn.net/guolin_blog/article/details/25466665#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/398375)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/398375/fork) <div> </div> </div> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: #993300;"><</span><span class="tag-name" style="font-weight: bold; color: #993300;">menu</span> <span class="attribute" style="color: red;">xmlns:android</span>=<span class="attribute-value" style="color: blue;">&#8220;http://schemas.android.com/apk/res/android&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">xmlns:tools</span>=<span class="attribute-value" style="color: blue;">&#8220;http://schemas.android.com/tools&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">tools:context</span>=<span class="attribute-value" style="color: blue;">&#8220;com.example.actionbartest.MainActivity&#8221;</span> <span class="tag" style="font-weight: bold; color: #993300;">></span> </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="tag" style="font-weight: bold; color: #993300;"><</span><span class="tag-name" style="font-weight: bold; color: #993300;">item</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:id</span>=<span class="attribute-value" style="color: blue;">&#8220;@+id/action_share&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:actionProviderClass</span>=<span class="attribute-value" style="color: blue;">&#8220;android.widget.ShareActionProvider&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:showAsAction</span>=<span class="attribute-value" style="color: blue;">&#8220;ifRoom&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:title</span>=<span class="attribute-value" style="color: blue;">&#8220;@string/action_share&#8221;</span> <span class="tag" style="font-weight: bold; color: #993300;">/></span> </span> - <span style="color: black;"> &#8230;&#8230; </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: #993300;"></</span><span class="tag-name" style="font-weight: bold; color: #993300;">menu</span><span class="tag" style="font-weight: bold; color: #993300;">></span> </span> 注意,ShareActionProvider会自己处理它的显示和事件,但我们仍然要记得给它添加一个title,以防止它会在overflow当中出现。 ...

2014年7月30日 · 18 分钟 · 天边的星星

Android ActionBar完全解析,使用官方推荐的最佳导航栏(上)

转载:http://blog.csdn.net/guolin_blog/article/details/18234477 本篇文章主要内容来自于Android Doc,我翻译之后又做了些加工,英文好的朋友也可以直接去读原文。 http://developer.android.com/guide/topics/ui/actionbar.html Action Bar是一种新増的导航栏功能,在Android 3.0之后加入到系统的API当中,它标识了用户当前操作界面的位置,并提供了额外的用户动作、界面导航等功能。使用ActionBar的好处是,它可以给提供一种全局统一的UI界面,使得用户在使用任何一款软件时都懂得该如何操作,并且ActionBar还可以自动适应各种不同大小的屏幕。下面是一张使用ActionBar的界面截图: 其中,[1]是ActionBar的图标,[2]是两个action按钮,[3]是overflow按钮。 由于Action Bar是在3.0以后的版本中加入的,如果想在2.x的版本里使用ActionBar的话则需要引入Support Library,不过3.0之前版本的市场占有率已经非常小了,这里简单起见我们就不再考虑去做向下兼容,而是只考虑4.0以上版本的用法。 添加和移除Action Bar ActionBar的添加非常简单,只需要在AndroidManifest.xml中指定Application或Activity的theme是Theme.Holo或其子类就可以了,而使用Eclipse创建的项目自动就会将Application的theme指定成Theme.Holo,所以ActionBar默认都是显示出来的。新建一个空项目并运行,效果如下图所示: 而如果想要移除ActionBar的话通常有两种方式,一是将theme指定成Theme.Holo.NoActionBar,表示使用一个不包含ActionBar的主题,二是在Activity中调用以下方法: **[java]** [view plain](http://blog.csdn.net/guolin_blog/article/details/18234477#)[copy](http://blog.csdn.net/guolin_blog/article/details/18234477#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/377213)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/377213/fork) <div> </div> </div> - <span style="color: black;">ActionBar actionBar = getActionBar(); </span> - <span style="color: black;">actionBar.hide(); </span> 现在重新运行一下程序,就可以看到ActionBar不再显示了,如下图所示: 修改Action Bar的图标和标题 默认情况下,系统会使用或者中icon属性指定的图片来作为ActionBar的图标,但是我们也可以改变这一默认行为。如果我们想要使用另外一张图片来作为ActionBar的图标,可以在或者中通过logo属性来进行指定。比如项目的res/drawable目录下有一张weather.png图片,就可以在AndroidManifest.xml中这样指定: **[html]** [view plain](http://blog.csdn.net/guolin_blog/article/details/18234477#)[copy](http://blog.csdn.net/guolin_blog/article/details/18234477#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/377213)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/377213/fork) <div> </div> </div> </div> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: #993300;"><</span><span class="tag-name" style="font-weight: bold; color: #993300;">activity</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:name</span>=<span class="attribute-value" style="color: blue;">&#8220;com.example.actionbartest.MainActivity&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:logo</span>=<span class="attribute-value" style="color: blue;">&#8220;@drawable/weather&#8221;</span> <span class="tag" style="font-weight: bold; color: #993300;">></span> </span> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: #993300;"></</span><span class="tag-name" style="font-weight: bold; color: #993300;">activity</span><span class="tag" style="font-weight: bold; color: #993300;">></span> </span> 现在重新运行一下程序,效果如下图所示: ![](http://img.blog.csdn.net/20140602121519562?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2lueXU4OTA4MDc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) OK,ActionBar的图标已经修改成功了,那么标题中的内容该怎样修改呢?其实也很简单,使用label属性来指定一个字符串就可以了,如下所示: **[html]** [view plain](http://blog.csdn.net/guolin_blog/article/details/18234477#)[copy](http://blog.csdn.net/guolin_blog/article/details/18234477#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/377213)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/377213/fork) <div> </div> </div> </div> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: #993300;"><</span><span class="tag-name" style="font-weight: bold; color: #993300;">activity</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:name</span>=<span class="attribute-value" style="color: blue;">&#8220;com.example.actionbartest.MainActivity&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:label</span>=<span class="attribute-value" style="color: blue;">&#8220;天气&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:logo</span>=<span class="attribute-value" style="color: blue;">&#8220;@drawable/weather&#8221;</span> <span class="tag" style="font-weight: bold; color: #993300;">></span> </span> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: #993300;"></</span><span class="tag-name" style="font-weight: bold; color: #993300;">activity</span><span class="tag" style="font-weight: bold; color: #993300;">></span> </span> 现在重新运行一下程序,结果如下图所示: ![](http://img.blog.csdn.net/20140602121652968?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2lueXU4OTA4MDc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 添加Action按钮 ActionBar还可以根据应用程序当前的功能来提供与其相关的Action按钮,这些按钮都会以图标或文字的形式直接显示在ActionBar上。当然,如果按钮过多,ActionBar上显示不完,多出的一些按钮可以隐藏在overflow里面(最右边的三个点就是overflow按钮),点击一下overflow按钮就可以看到全部的Action按钮了。 当Activity启动的时候,系统会调用Activity的onCreateOptionsMenu()方法来取出所有的Action按钮,我们只需要在这个方法中去加载一个menu资源,并把所有的Action按钮都定义在资源文件里面就可以了。 那么我们先来看下menu资源文件该如何定义,代码如下所示: **[html]** [view plain](http://blog.csdn.net/guolin_blog/article/details/18234477#)[copy](http://blog.csdn.net/guolin_blog/article/details/18234477#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/377213)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/377213/fork) <div> </div> </div> </div> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: #993300;"><</span><span class="tag-name" style="font-weight: bold; color: #993300;">menu</span> <span class="attribute" style="color: red;">xmlns:android</span>=<span class="attribute-value" style="color: blue;">&#8220;http://schemas.android.com/apk/res/android&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">xmlns:tools</span>=<span class="attribute-value" style="color: blue;">&#8220;http://schemas.android.com/tools&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">tools:context</span>=<span class="attribute-value" style="color: blue;">&#8220;com.example.actionbartest.MainActivity&#8221;</span> <span class="tag" style="font-weight: bold; color: #993300;">></span> </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="tag" style="font-weight: bold; color: #993300;"><</span><span class="tag-name" style="font-weight: bold; color: #993300;">item</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:id</span>=<span class="attribute-value" style="color: blue;">&#8220;@+id/action_compose&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:icon</span>=<span class="attribute-value" style="color: blue;">&#8220;@drawable/ic_action_compose&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:showAsAction</span>=<span class="attribute-value" style="color: blue;">&#8220;always&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:title</span>=<span class="attribute-value" style="color: blue;">&#8220;@string/action_compose&#8221;</span><span class="tag" style="font-weight: bold; color: #993300;">/></span> </span> - <span style="color: black;"> <span class="tag" style="font-weight: bold; color: #993300;"><</span><span class="tag-name" style="font-weight: bold; color: #993300;">item</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:id</span>=<span class="attribute-value" style="color: blue;">&#8220;@+id/action_delete&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:icon</span>=<span class="attribute-value" style="color: blue;">&#8220;@drawable/ic_action_delete&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:showAsAction</span>=<span class="attribute-value" style="color: blue;">&#8220;always&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:title</span>=<span class="attribute-value" style="color: blue;">&#8220;@string/action_delete&#8221;</span><span class="tag" style="font-weight: bold; color: #993300;">/></span> </span> - <span style="color: black;"> <span class="tag" style="font-weight: bold; color: #993300;"><</span><span class="tag-name" style="font-weight: bold; color: #993300;">item</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:id</span>=<span class="attribute-value" style="color: blue;">&#8220;@+id/action_settings&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:icon</span>=<span class="attribute-value" style="color: blue;">&#8220;@drawable/ic_launcher&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:showAsAction</span>=<span class="attribute-value" style="color: blue;">&#8220;never&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:title</span>=<span class="attribute-value" style="color: blue;">&#8220;@string/action_settings&#8221;</span><span class="tag" style="font-weight: bold; color: #993300;">/></span> </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: #993300;"></</span><span class="tag-name" style="font-weight: bold; color: #993300;">menu</span><span class="tag" style="font-weight: bold; color: #993300;">></span> </span> 可以看到,这里我们通过三个<item>标签定义了三个Action按钮。<item>标签中又有一些属性,其中id是该Action按钮的唯一标识符,icon用于指定该按钮的图标,title用于指定该按钮可能显示的文字(在图标能显示的情况下,通常不会显示文字),showAsAction则指定了该按钮显示的位置,主要有以下几种值可选:always表示永远显示在ActionBar中,如果屏幕空间不够则无法显示,ifRoom表示屏幕空间够的情况下显示在ActionBar中,不够的话就显示在overflow中,never则表示永远显示在overflow中。 接着,重写Activity的onCreateOptionsMenu()方法,代码如下所示: **[java]** [view plain](http://blog.csdn.net/guolin_blog/article/details/18234477#)[copy](http://blog.csdn.net/guolin_blog/article/details/18234477#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/377213)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/377213/fork) <div> </div> </div> </div> - <span style="color: black;"><span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">public</span> <span class="keyword" style="font-weight: bold; color: #006699;">boolean</span> onCreateOptionsMenu(Menu menu) { </span> - <span style="color: black;"> MenuInflater inflater = getMenuInflater(); </span> - <span style="color: black;"> inflater.inflate(R.menu.main, menu); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">return</span> <span class="keyword" style="font-weight: bold; color: #006699;">super</span>.onCreateOptionsMenu(menu); </span> - <span style="color: black;">} </span> 这部分代码很简单,仅仅是调用了MenuInflater的inflate()方法来加载menu资源就可以了。现在重新运行一下程序,结果如下图所示: ![](http://img.blog.csdn.net/20140602121900750?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2lueXU4OTA4MDc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 可以看到,action_compose和action_delete这两个按钮已经在ActionBar中显示出来了,而action_settings这个按钮由于showAsAction属性设置成了never,所以被隐藏到了overflow当中,只要点击一下overflow按钮就可以看到它了。 这里我们注意到,显示在ActionBar上的按钮都只有一个图标而已,我们在title中指定的文字并没有显示出来。没错,title中的内容通常情况下只会在overflow中显示出来,ActionBar中由于屏幕空间有限,默认是不会显示title内容的。但是出于以下几种因素考虑,即使title中的内容无法显示出来,我们也应该给每个item中都指定一个title属性: - 当ActionBar中的剩余空间不足的时候,如果Action按钮指定的showAsAction属性是ifRoom的话,该Action按钮就会出现在overflow当中,此时就只有title能够显示了。 - 如果Action按钮在ActionBar中显示,用户可能通过长按该Action按钮的方式来查看到title的内容。 响应Action按钮的点击事件 当用户点击Action按钮的时候,系统会调用Activity的onOptionsItemSelected()方法,通过方法传入的MenuItem参数,我们可以调用它的getItemId()方法和menu资源中的id进行比较,从而辨别出用户点击的是哪一个Action按钮,比如: **[java]** [view plain](http://blog.csdn.net/guolin_blog/article/details/18234477#)[copy](http://blog.csdn.net/guolin_blog/article/details/18234477#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/377213)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/377213/fork) <div> </div> </div> </div> - <span style="color: black;"><span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">public</span> <span class="keyword" style="font-weight: bold; color: #006699;">boolean</span> onOptionsItemSelected(MenuItem item) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">switch</span> (item.getItemId()) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">case</span> R.id.action_compose: </span> - <span style="color: black;"> Toast.makeText(<span class="keyword" style="font-weight: bold; color: #006699;">this</span>, <span class="string" style="color: blue;">&#8220;Compose&#8221;</span>, Toast.LENGTH_SHORT).show(); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">return</span> <span class="keyword" style="font-weight: bold; color: #006699;">true</span>; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">case</span> R.id.action_delete: </span> - <span style="color: black;"> Toast.makeText(<span class="keyword" style="font-weight: bold; color: #006699;">this</span>, <span class="string" style="color: blue;">&#8220;Delete&#8221;</span>, Toast.LENGTH_SHORT).show(); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">return</span> <span class="keyword" style="font-weight: bold; color: #006699;">true</span>; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">case</span> R.id.action_settings: </span> - <span style="color: black;"> Toast.makeText(<span class="keyword" style="font-weight: bold; color: #006699;">this</span>, <span class="string" style="color: blue;">&#8220;Settings&#8221;</span>, Toast.LENGTH_SHORT).show(); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">return</span> <span class="keyword" style="font-weight: bold; color: #006699;">true</span>; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">default</span>: </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">return</span> <span class="keyword" style="font-weight: bold; color: #006699;">super</span>.onOptionsItemSelected(item); </span> - <span style="color: black;"> } </span> - <span style="color: black;">} </span> 可以看到,我们让每个Action按钮被点击的时候都弹出一个Toast,现在重新运行一下代码,结果如下图所示: ![](http://img.blog.csdn.net/20140602115507171) 通过Action Bar图标进行导航 启用ActionBar图标导航的功能,可以允许用户根据当前应用的位置来在不同界面之间切换。比如,A界面展示了一个列表,点击某一项之后进入了B界面,这时B界面就应该启用ActionBar图标导航功能,这样就可以回到A界面。 我们可以通过调用setDisplayHomeAsUpEnabled()方法来启用ActionBar图标导航功能,比如: **[java]** [view plain](http://blog.csdn.net/guolin_blog/article/details/18234477#)[copy](http://blog.csdn.net/guolin_blog/article/details/18234477#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/377213)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/377213/fork) <div> </div> </div> </div> - <span style="color: black;"><span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">protected</span> <span class="keyword" style="font-weight: bold; color: #006699;">void</span> onCreate(Bundle savedInstanceState) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">super</span>.onCreate(savedInstanceState); </span> - <span style="color: black;"> setTitle(<span class="string" style="color: blue;">&#8220;天气&#8221;</span>); </span> - <span style="color: black;"> setContentView(R.layout.activity_main); </span> - <span style="color: black;"> ActionBar actionBar = getActionBar(); </span> - <span style="color: black;"> actionBar.setDisplayHomeAsUpEnabled(<span class="keyword" style="font-weight: bold; color: #006699;">true</span>); </span> - <span style="color: black;">} </span> 现在重新运行一下程序,结果如下图所示: ![](http://img.blog.csdn.net/20140602152755500?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2lueXU4OTA4MDc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 可以看到,在ActionBar图标的左侧出现了一个向左的箭头,通常情况下这都表示返回的意思,因此最简单的实现就是在它的点击事件里面加入finish()方法就可以了,如下所示: **[java]** [view plain](http://blog.csdn.net/guolin_blog/article/details/18234477#)[copy](http://blog.csdn.net/guolin_blog/article/details/18234477#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/377213)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/377213/fork) <div> </div> </div> </div> - <span style="color: black;"><span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">public</span> <span class="keyword" style="font-weight: bold; color: #006699;">boolean</span> onOptionsItemSelected(MenuItem item) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">switch</span> (item.getItemId()) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">case</span> android.R.id.home: </span> - <span style="color: black;"> finish(); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">return</span> <span class="keyword" style="font-weight: bold; color: #006699;">true</span>; </span> - <span style="color: black;"> …… </span> - <span style="color: black;"> } </span> - <span style="color: black;">} </span> 当点击ActionBar图标的时候,系统同样会调用onOptionsItemSelected()方法,并且此时的itemId是android.R.id.home,所以finish()方法也就是加在这里的了。 现在看上去,ActionBar导航和Back键的功能貌似是一样的。没错,如果我们只是简单地finish了一下,ActionBar导航和Back键的功能是完全一样的,但ActionBar导航的设计初衷并不是这样的,它和Back键的功能还是有一些区别的,举个例子吧。 ![](http://img.blog.csdn.net/20140602161656000) 上图中的Conversation List是收件箱的主界面,现在我们点击第一封邮件会进入到Conversation1 details界面,然后点击下一封邮件会进入到Conversation 2 details界面,再点击下一封邮箱会进入到Conversation3 details界面。好的,这个时候如果我们按下Back键,应该会回到Conversation 2 details界面,再按一次Back键应该回到Conversation1 details界面,再按一次Back键才会回到Conversation List。而ActionBar导航则不应该表现出这种行为,无论我们当前在哪一个Conversation details界面,点击一下导航按钮都应该回到Conversation List界面才对。 这就是ActionBar导航和Back键在设计上的区别,那么该怎样才能实现这样的功能呢?其实并不复杂,实现标准的ActionBar导航功能只需三步走。 第一步我们已经实现了,就是调用setDisplayHomeAsUpEnabled()方法,并传入true。 第二步需要在AndroidManifest.xml中配置父Activity,如下所示: **[html]** [view plain](http://blog.csdn.net/guolin_blog/article/details/18234477#)[copy](http://blog.csdn.net/guolin_blog/article/details/18234477#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/377213)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/377213/fork) <div> </div> </div> </div> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: #993300;"><</span><span class="tag-name" style="font-weight: bold; color: #993300;">activity</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:name</span>=<span class="attribute-value" style="color: blue;">&#8220;com.example.actionbartest.MainActivity&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:logo</span>=<span class="attribute-value" style="color: blue;">&#8220;@drawable/weather&#8221;</span> <span class="tag" style="font-weight: bold; color: #993300;">></span> </span> - <span style="color: black;"> <span class="tag" style="font-weight: bold; color: #993300;"><</span><span class="tag-name" style="font-weight: bold; color: #993300;">meta-data</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:name</span>=<span class="attribute-value" style="color: blue;">&#8220;android.support.PARENT_ACTIVITY&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:value</span>=<span class="attribute-value" style="color: blue;">&#8220;com.example.actionbartest.LaunchActivity&#8221;</span> <span class="tag" style="font-weight: bold; color: #993300;">/></span> </span> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: #993300;"></</span><span class="tag-name" style="font-weight: bold; color: #993300;">activity</span><span class="tag" style="font-weight: bold; color: #993300;">></span> </span> 可以看到,这里通过meta-data标签指定了MainActivity的父Activity是LaunchActivity,在Android 4.1版本之后,也可以直接使用android:parentActivityName这个属性来进行指定,如下所示: **[html]** [view plain](http://blog.csdn.net/guolin_blog/article/details/18234477#)[copy](http://blog.csdn.net/guolin_blog/article/details/18234477#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/377213)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/377213/fork) <div> </div> </div> </div> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: #993300;"><</span><span class="tag-name" style="font-weight: bold; color: #993300;">activity</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:name</span>=<span class="attribute-value" style="color: blue;">&#8220;com.example.actionbartest.MainActivity&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:logo</span>=<span class="attribute-value" style="color: blue;">&#8220;@drawable/weather&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:parentActivityName</span>=<span class="attribute-value" style="color: blue;">&#8220;com.example.actionbartest.LaunchActivity&#8221;</span> <span class="tag" style="font-weight: bold; color: #993300;">></span> </span> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: #993300;"></</span><span class="tag-name" style="font-weight: bold; color: #993300;">activity</span><span class="tag" style="font-weight: bold; color: #993300;">></span> </span> 第三步则需要对android.R.id.home这个事件进行一些特殊处理,如下所示: **[java]** [view plain](http://blog.csdn.net/guolin_blog/article/details/18234477#)[copy](http://blog.csdn.net/guolin_blog/article/details/18234477#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/377213)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/377213/fork) <div> </div> </div> </div> - <span style="color: black;"><span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">public</span> <span class="keyword" style="font-weight: bold; color: #006699;">boolean</span> onOptionsItemSelected(MenuItem item) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">switch</span> (item.getItemId()) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">case</span> android.R.id.home: </span> - <span style="color: black;"> Intent upIntent = NavUtils.getParentActivityIntent(<span class="keyword" style="font-weight: bold; color: #006699;">this</span>); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">if</span> (NavUtils.shouldUpRecreateTask(<span class="keyword" style="font-weight: bold; color: #006699;">this</span>, upIntent)) { </span> - <span style="color: black;"> TaskStackBuilder.create(<span class="keyword" style="font-weight: bold; color: #006699;">this</span>) </span> - <span style="color: black;"> .addNextIntentWithParentStack(upIntent) </span> - <span style="color: black;"> .startActivities(); </span> - <span style="color: black;"> } <span class="keyword" style="font-weight: bold; color: #006699;">else</span> { </span> - <span style="color: black;"> upIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); </span> - <span style="color: black;"> NavUtils.navigateUpTo(<span class="keyword" style="font-weight: bold; color: #006699;">this</span>, upIntent); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">return</span> <span class="keyword" style="font-weight: bold; color: #006699;">true</span>; </span> - <span style="color: black;"> &#8230;&#8230; </span> - <span style="color: black;"> } </span> - <span style="color: black;">} </span> 其中,调用NavUtils.getParentActivityIntent()方法可以获取到跳转至父Activity的Intent,然后如果父Activity和当前Activity是在同一个Task中的,则直接调用navigateUpTo()方法进行跳转,如果不是在同一个Task中的,则需要借助TaskStackBuilder来创建一个新的Task。 这样,就按照标准的规范成功实现ActionBar导航的功能了。 添加Action View ActionView是一种可以在ActionBar中替换Action按钮的控件,它可以允许用户在不切换界面的情况下通过ActionBar完成一些较为丰富的操作。比如说,你需要完成一个搜索功能,就可以将SeachView这个控件添加到ActionBar中。 为了声明一个ActionView,我们可以在menu资源中通过actionViewClass属性来指定一个控件,例如可以使用如下方式添加SearchView: **[html]** [view plain](http://blog.csdn.net/guolin_blog/article/details/18234477#)[copy](http://blog.csdn.net/guolin_blog/article/details/18234477#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/377213)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/377213/fork) <div> </div> </div> </div> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: #993300;"><</span><span class="tag-name" style="font-weight: bold; color: #993300;">menu</span> <span class="attribute" style="color: red;">xmlns:android</span>=<span class="attribute-value" style="color: blue;">&#8220;http://schemas.android.com/apk/res/android&#8221;</span> <span class="tag" style="font-weight: bold; color: #993300;">></span> </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="tag" style="font-weight: bold; color: #993300;"><</span><span class="tag-name" style="font-weight: bold; color: #993300;">item</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:id</span>=<span class="attribute-value" style="color: blue;">&#8220;@+id/action_search&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:icon</span>=<span class="attribute-value" style="color: blue;">&#8220;@drawable/ic_action_search&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:actionViewClass</span>=<span class="attribute-value" style="color: blue;">&#8220;android.widget.SearchView&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:showAsAction</span>=<span class="attribute-value" style="color: blue;">&#8220;ifRoom|collapseActionView&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:title</span>=<span class="attribute-value" style="color: blue;">&#8220;@string/action_search&#8221;</span> <span class="tag" style="font-weight: bold; color: #993300;">/></span> </span> - <span style="color: black;"> &#8230;&#8230; </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: #993300;"></</span><span class="tag-name" style="font-weight: bold; color: #993300;">menu</span><span class="tag" style="font-weight: bold; color: #993300;">></span> </span> 注意在showAsAction属性中我们还声明了一个collapseActionView,这个值表示该控件可以被合并成一个Action按钮。 现在重新运行一下程序,效果如下图所示: ![](http://img.blog.csdn.net/20140604232000843?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ3VvbGluX2Jsb2c=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) OK,果然有一个搜索样式的Action按钮出现了,现在点击一下这个搜索按钮,效果如下图所示: ![](http://img.blog.csdn.net/20140604232624109?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ3VvbGluX2Jsb2c=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 可以看到,这时SearchView就会展开占满整个ActionBar,而其它的Action按钮由于将showAsAction属性设置成了ifRoom,此时都会隐藏到overflow当中。 如果你还希望在代码中对SearchView的属性进行配置(比如添加监听事件等),完全没有问题,只需要在onCreateOptionsMenu()方法中获取该ActionView的实例就可以了,代码如下所示: **[java]** [view plain](http://blog.csdn.net/guolin_blog/article/details/18234477#)[copy](http://blog.csdn.net/guolin_blog/article/details/18234477#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/377213)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/377213/fork) <div> </div> </div> </div> - <span style="color: black;"><span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">public</span> <span class="keyword" style="font-weight: bold; color: #006699;">boolean</span> onCreateOptionsMenu(Menu menu) { </span> - <span style="color: black;"> MenuInflater inflater = getMenuInflater(); </span> - <span style="color: black;"> inflater.inflate(R.menu.main, menu); </span> - <span style="color: black;"> MenuItem searchItem = menu.findItem(R.id.action_search); </span> - <span style="color: black;"> SearchView searchView = (SearchView) searchItem.getActionView(); </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// 配置SearchView的属性</span> </span> - <span style="color: black;"> &#8230;&#8230; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">return</span> <span class="keyword" style="font-weight: bold; color: #006699;">super</span>.onCreateOptionsMenu(menu); </span> - <span style="color: black;">} </span> 在得到了SearchView的实例之后,就可以任意地配置它的各种属性了。关于SearchView的更多详细用法,可以参考官方文档 [http://developer.android.com/guide/topics/search/search-dialog.html](http://developer.android.com/guide/topics/search/search-dialog.html) 。</div> <div> 除此之外,有些程序可能还希望在ActionView展开和合并的时候显示不同的界面,其实我们只需要去注册一个ActionView的监听器就能实现这样的功能了,代码如下所示: <div class="dp-highlighter bg_java"> <div class="bar"> <div class="tools" style="color: silver;"> **[java]** [view plain](http://blog.csdn.net/guolin_blog/article/details/18234477#)[copy](http://blog.csdn.net/guolin_blog/article/details/18234477#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/377213)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/377213/fork) <div> </div> </div> </div> - <span style="color: black;"><span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">public</span> <span class="keyword" style="font-weight: bold; color: #006699;">boolean</span> onCreateOptionsMenu(Menu menu) { </span> - <span style="color: black;"> MenuInflater inflater = getMenuInflater(); </span> - <span style="color: black;"> inflater.inflate(R.menu.main, menu); </span> - <span style="color: black;"> MenuItem searchItem = menu.findItem(R.id.action_search); </span> - <span style="color: black;"> searchItem.setOnActionExpandListener(<span class="keyword" style="font-weight: bold; color: #006699;">new</span> OnActionExpandListener() { </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">public</span> <span class="keyword" style="font-weight: bold; color: #006699;">boolean</span> onMenuItemActionExpand(MenuItem item) { </span> - <span style="color: black;"> Log.d(<span class="string" style="color: blue;">&#8220;TAG&#8221;</span>, <span class="string" style="color: blue;">&#8220;on expand&#8221;</span>); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">return</span> <span class="keyword" style="font-weight: bold; color: #006699;">true</span>; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">public</span> <span class="keyword" style="font-weight: bold; color: #006699;">boolean</span> onMenuItemActionCollapse(MenuItem item) { </span> - <span style="color: black;"> Log.d(<span class="string" style="color: blue;">&#8220;TAG&#8221;</span>, <span class="string" style="color: blue;">&#8220;on collapse&#8221;</span>); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">return</span> <span class="keyword" style="font-weight: bold; color: #006699;">true</span>; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> }); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">return</span> <span class="keyword" style="font-weight: bold; color: #006699;">super</span>.onCreateOptionsMenu(menu); </span> - <span style="color: black;">} </span> </div> 可以看到,调用MenuItem的setOnActionExpandListener()方法就可以注册一个监听器了,当SearchView展开的时候就会回调onMenuItemActionExpand()方法,当SearchView合并的时候就会调用onMenuItemActionCollapse()方法,我们在这两个方法中进行相应的UI操作就可以了。 </div> <div> </div> ## <a style="color: #336699;" name="t6"></a>Overflow按钮不显示的情况 <div> 虽然现在我们已经掌握了不少ActionBar的用法,但是当你真正去使用它的时候还是可能会遇到各种各样的问题,比如很多人都会碰到overflow按钮不显示的情况。明明是同样的一份代码,overflow按钮在有些手机上会显示,而在有些手机上偏偏就不显示,这是为什么呢?后来我总结了一下,overflow按钮的显示情况和手机的硬件情况是有关系的,如果手机没有物理Menu键的话,overflow按钮就可以显示,如果有物理Menu键的话,overflow按钮就不会显示出来。比如我们启动一个有Menu键的模拟器,然后将代码运行到该模拟器上,结果如下图所示: </div> <div> ![](http://img.blog.csdn.net/20140603224128421?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2lueXU4OTA4MDc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) </div> <div> 可以看到,ActionBar最右边的overflow按钮不见了!那么此时我们如何查看隐藏在overflow中的Action按钮呢?其实非常简单,按一下Menu键,隐藏的内容就会从底部出来了,如下图所示: </div> <div> ![](http://img.blog.csdn.net/20140603224335953?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2lueXU4OTA4MDc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) </div> <div> 看到这里相信不少朋友都想吐槽一下了,这显然是一种非常蛋疼的设计,在不同手机上竟然显示了不同的界面,而且操作方法也完全不一样,这样会给用户一种非常不习惯的感觉。话说Google为什么要把ActionBar的overflow设计成这样我也不太理解,但是我们还是有办法改变这一默认行为的。 </div> <div> 实际上,在ViewConfiguration这个类中有一个叫做sHasPermanentMenuKey的静态变量,系统就是根据这个变量的值来判断手机有没有物理Menu键的。当然这是一个内部变量,我们无法直接访问它,但是可以通过反射的方式修改它的值,让它永远为false就可以了,代码如下所示: <div class="dp-highlighter bg_java"> <div class="bar"> <div class="tools" style="color: silver;"> **[java]** [view plain](http://blog.csdn.net/guolin_blog/article/details/18234477#)[copy](http://blog.csdn.net/guolin_blog/article/details/18234477#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/377213)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/377213/fork) <div> </div> </div> </div> - <span style="color: black;"><span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">protected</span> <span class="keyword" style="font-weight: bold; color: #006699;">void</span> onCreate(Bundle savedInstanceState) { </span> - <span style="color: black;"> &#8230;&#8230; </span> - <span style="color: black;"> setOverflowShowingAlways(); </span> - <span style="color: black;">} </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">private</span> <span class="keyword" style="font-weight: bold; color: #006699;">void</span> setOverflowShowingAlways() { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">try</span> { </span> - <span style="color: black;"> ViewConfiguration config = ViewConfiguration.get(<span class="keyword" style="font-weight: bold; color: #006699;">this</span>); </span> - <span style="color: black;"> Field menuKeyField = ViewConfiguration.<span class="keyword" style="font-weight: bold; color: #006699;">class</span>.getDeclaredField(<span class="string" style="color: blue;">&#8220;sHasPermanentMenuKey&#8221;</span>); </span> - <span style="color: black;"> menuKeyField.setAccessible(<span class="keyword" style="font-weight: bold; color: #006699;">true</span>); </span> - <span style="color: black;"> menuKeyField.setBoolean(config, <span class="keyword" style="font-weight: bold; color: #006699;">false</span>); </span> - <span style="color: black;"> } <span class="keyword" style="font-weight: bold; color: #006699;">catch</span> (Exception e) { </span> - <span style="color: black;"> e.printStackTrace(); </span> - <span style="color: black;"> } </span> - <span style="color: black;">} </span> </div> 这里我们在onCreate()方法的最后调用了setOverflowShowingAlways()方法,而这个方法的内部就是使用反射的方式将sHasPermanentMenuKey的值设置成false,现在重新运行一下代码,结果如下图所示: </div> <div> ![](http://img.blog.csdn.net/20140603231228859?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2lueXU4OTA4MDc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) </div> <div> 可以看到,即使是在有Menu键的手机上,也能让overflow按钮显示出来了,这样就可以大大增加我们软件界面和操作的统一性。 </div> <div> </div> ## <a style="color: #336699;" name="t7"></a>让Overflow中的选项显示图标 <div> 如果你点击一下overflow按钮去查看隐藏的Action按钮,你会发现这部分Action按钮都是只显示文字不显示图标的,如下图所示: </div> <div> ![](http://img.blog.csdn.net/20140603234836500?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2lueXU4OTA4MDc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) </div> <div> 这是官方的默认效果,Google认为隐藏在overflow中的Action按钮都应该只显示文字。当然,如果你认为这样不够美观,希望在overflow中的Action按钮也可以显示图标,我们仍然可以想办法来改变这一默认行为。 </div> <div> 其实,overflow中的Action按钮应不应该显示图标,是由MenuBuilder这个类的setOptionalIconsVisible方法来决定的,如果我们在overflow被展开的时候给这个方法传入true,那么里面的每一个Action按钮对应的图标就都会显示出来了。调用的方法当然仍然是用反射了,代码如下所示: <div class="dp-highlighter bg_java"> <div class="bar"> <div class="tools" style="color: silver;"> **[java]** [view plain](http://blog.csdn.net/guolin_blog/article/details/18234477#)[copy](http://blog.csdn.net/guolin_blog/article/details/18234477#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/377213)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/377213/fork) <div> </div> </div> </div> - <span style="color: black;"><span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">public</span> <span class="keyword" style="font-weight: bold; color: #006699;">boolean</span> onMenuOpened(<span class="keyword" style="font-weight: bold; color: #006699;">int</span> featureId, Menu menu) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">if</span> (featureId == Window.FEATURE_ACTION_BAR && menu != <span class="keyword" style="font-weight: bold; color: #006699;">null</span>) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">if</span> (menu.getClass().getSimpleName().equals(<span class="string" style="color: blue;">&#8220;MenuBuilder&#8221;</span>)) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">try</span> { </span> - <span style="color: black;"> Method m = menu.getClass().getDeclaredMethod(<span class="string" style="color: blue;">&#8220;setOptionalIconsVisible&#8221;</span>, Boolean.TYPE); </span> - <span style="color: black;"> m.setAccessible(<span class="keyword" style="font-weight: bold; color: #006699;">true</span>); </span> - <span style="color: black;"> m.invoke(menu, <span class="keyword" style="font-weight: bold; color: #006699;">true</span>); </span> - <span style="color: black;"> } <span class="keyword" style="font-weight: bold; color: #006699;">catch</span> (Exception e) { </span> - <span style="color: black;"> } </span> - <span style="color: black;"> } </span> - <span style="color: black;"> } </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">return</span> <span class="keyword" style="font-weight: bold; color: #006699;">super</span>.onMenuOpened(featureId, menu); </span> - <span style="color: black;">} </span> </div> 可以看到,这里我们重写了一个onMenuOpened()方法,当overflow被展开的时候就会回调这个方法,接着在这个方法的内部通过返回反射的方法将MenuBuilder的setOptionalIconsVisible变量设置为true就可以了。 </div> <div> 现在重新运行一下代码,结果如下图所示: </div> <div> ![](http://img.blog.csdn.net/20140603235840984?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2lueXU4OTA4MDc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) </div> <div> 好了,目前为止我们已经把ActionBar的基础知识介绍完了,那么今天的讲解就到这里 </div>

2014年7月30日 · 12 分钟 · 天边的星星

HttpURLConnection 访问图片时发生403问题,使用DefaultHttpClient就OK

请求某些网站的图片时 /** 根据一个网络连接(String)获取bitmap图像 @param imageUri @return @throws MalformedURLException */ public Bitmap getbitmap(String imageUri) { // 显示网络上的图片 Bitmap bitmap = null; try { URL myFileUrl = new URL(imageUri); HttpURLConnection conn = (HttpURLConnection) myFileUrl .openConnection(); // conn.setDoInput(true); conn.setRequestProperty(“User-agent”, “Mozilla/4.0”); conn.connect(); InputStream is = conn.getInputStream(); bitmap = BitmapFactory.decodeStream(is); is.close(); } catch (IOException e) { e.printStackTrace(); return null; } return bitmap; } 如果不添加conn.setRequestProperty(“User-agent”, “Mozilla/4.0”);这句会造成返回的状态code是403, 使用 public Bitmap loadImageFromUrl(String url) { Bitmap d = null; // URL m; InputStream i = null; try { HttpGet get = new HttpGet(url); DefaultHttpClient client = new DefaultHttpClient(); HttpResponse re = client.execute(get); i = re.getEntity().getContent(); } catch (MalformedURLException e1) { e1.printStackTrace(); return null; } catch (IOException e) { e.printStackTrace(); return null; } d = BitmapFactory.decodeStream(i); return d; } ...

2014年7月24日 · 1 分钟 · 天边的星星

安卓面试题(一)

面试题一:AIDL****的全称是什么?如何工作? Android interface definition language (android接口定义语言) , 用来跨进程的访问方法, 像 游戏中调用支付宝接口就是用的这个。 访问远程的服务的方法. 如何工作。 面试题二:Android****程序运行时权限与文件系统权限的区别? 程序运行时权限:Android程序执行需要读取到安全敏感项必需在androidmanifest.xml中声明相关权限请求,打电话,访问网络,获取坐标,写sd卡,读写联系人等..安装的时候会提示用户。 文件系统权限:其实就是Linux的文件系统权限,比如-rw—— 私有权限 -rw-rw-rw- 全局可读可写,(777是可读可写可执行1+2+4)还有sharedpreference里面的Context.Mode_private Context.Mode.world_read_able Context.Mode_world_writeable夜市文件系统的权限。 **面试题三:**系统上安装了多种浏览器,能否指定某浏览器访问指定页面? 找到对应的浏览器的意图,传递数据URI , 激活这个意图 Intent .setAction(VIEW) Intent intent = new Intent(); // com.android.browser/.BrowserActivity intent.setClassName(“com.android.browser”, “com.android.browser.BrowserActivity”); Intent.setdata(uri); 像腾讯那个检测是否安装自己的浏览器,方法是queryintentactivity(),获取到所有Action。然后查里面有没有自己浏览器的action,没有的话就提示用户。 面试题四:对主线程的理解: 耗时的不能再主线程做,会anr异常,像安卓四大组件都是在主线程里面。 面试题五:Framework****工作方式及原理,Activity是如何生成一个view的,机制是什么? 所有的框架都是基于反射 和 配置文件(manifest)的。 Activity创建一个view是通过 ondraw 画出来的, 画这个view之前呢,还会调用onmeasure方法来计算显示的大小.但是Surfaceview 是直接操作硬件的,因为 或者视频播放对帧数有要求,onDraw效率太低,不够使,Surfaceview直接把数据写到显存。 面试题六:android****本身的一些限制,比如apk包大小限制,读取大文件时的时间限? 如果在broadCast里面不能超过10秒, 在service里面不能超过20秒 在主线程里面不能超过5秒。 像有些系统不能安装大文件,我们一般是把素材文件放到一个素材包而不是安装包,两者区分开。 **面试题七:**如何加载的音乐信息,如何改善其效率? Android提供mediascanner,mediaStore等接口, 音乐文件的信息都会存放到系统的数据库表中,可以通过content provider获取, 显示出来,改善效率,是个常见问题, 可以从以下几个方面作答, 分批加载数据, 延时加载数据, 合理使用缓存等… 预先加载一些 都会的使用的大的class的字节码, 提前加载. 时间换时间 空间换时间 面试题八:ListView****如何提高其效率? 异步加载数据, 分页加载数据,使用 onscallLinster(); 2.Static class ViewHolder ...

2014年7月24日 · 1 分钟 · 天边的星星

Android开源项目第四篇——开发及测试工具篇

本文为那些不错的Android开源项目第四篇——开发工具篇,主要介绍Android开发工具和测试工具相关的开源项目。 最新内容请访问[AndroidOpenProject@Github](https://github.com/Trinea/android-open-project),欢迎Star和Fork。 Android开源项目系列汇总已完成,包括: [Android开源项目第一篇——个性化控件(View)篇](http://www.trinea.cn/android/android-open-source-projects-view/) Android开源项目第二篇——工具库篇 Android开源项目第三篇——优秀项目篇 Android开源项目第四篇——开发及测试工具篇 Android开源项目第五篇——优秀个人和团体篇 **1、Buck** facebook开源的Android编译工具,效率是ant的两倍。主要优点在于: (1) 加快编译速度,通过并行利用多核cpu和跟踪不变资源减少增量编译时间实现 (2) 可以在编译系统中生成编译规则而无须另外的系统生成编译规则文件 (3) 编译同时可生成单元测试结果 (4) 既可用于IDE编译也可用于持续集成编译 (5) facebook持续优化中 项目地址:https://github.com/facebook/buck **2、Android Maven Plugin** Android Maven插件,可用于对android三方依赖进行管理。在J2EE开发中,maven是非常成熟的依赖库管理工具,可统一管理依赖库。 项目地址:https://github.com/jayway/maven-android-plugin **3、Spoon** 可用于android不同机型设备自动化测试,能将应用apk和测试apk运行在不同机器上并生成相应测试报告。 项目地址:https://github.com/square/spoon **4、Android FEST** 提供一些列方便的断言,可用于提高编写Android自测代码效率 项目地址:https://github.com/square/fest-android **5、SelectorChapek for Android** Android Studio插件,可根据固定文件名格式资源自动生成drawable selectors xml文件。 项目地址:https://github.com/inmite/android-selector-chapek **6、Android Resource Navigator** chrome插件,可以方便的查看github上android源码工程的styles.xml和themes.xml。主要功能: (1) 快速打开android styles.xml themes.xml (2) 方便在资源间跳转。styles.xml themes.xml文件中资源链接跳转,可以方便跳转到某个资源 (3) 方便查找某个style和theme。chrome地址栏输入arn+tab+搜索内容回车即可 (4) 自动下载不同分辨率下的drawable (5) 通过映射查找那些不是按照固定命名规则命名的style和theme 项目地址:https://github.com/jgilfelt/android-resource-navigator 示例:https://chrome.google.com/webstore/detail/android-resource-navigato/agoomkionjjbejegcejiefodgbckeebo?hl=en&gl=GB ...

2014年6月6日 · 1 分钟 · 天边的星星

eclipse 中安装 maven 插件 ,建立maven工程

** 一、插件安装:** 1、下载maven插件 打开eclipse ,help-install new software add name : m2e url: http://download.eclipse.org/technology/m2e/releases/ (今天是2014-2-26,这个地址是有效的,以后不知道是否有效) name : m2e url: http://rgladwell.github.com/m2e-android/updates (2014-4-16,这个地址是有效的,以后不知道是否有效) 2、下载 maven-bin 下载地址 http://download.csdn.net/download/cyw8998/6963959 3、 下载下来之后,解压,找个路径放进去, 把bin的位置,设在环境变量里 新建环境变量MAVEN_HOME , PATH里配置解压后的bin路径 检查一下 进入cmd,运行mvn -v,如果显示出版本号,说明配置成功了。 4、 为了使得Eclipse中安装的Maven插件,同windows中安装的那个相同,需要让eclipse中的maven重新定位一下 Window -> Preference -> Maven -> Installation -> Add 现在就可以建立maven工程了。 二、建立工程: **方法A: ** 1、打开eclipse,通过工具new project出现如下窗口: 2、选中Maven Project, 点击Next,然后保持默认选项,再点击next,弹出如下窗口 3、在过滤器中输入android,如果你已经有这样的插件,将会显示出来,否则就需要通过Add Archetype按钮进行添加 4、 3-1、因为我之前已经安装了这三个插件,因此输入过滤器后直接就有了,如果系统没有找到android-quickstart插件,则需点击Add Archetype,弹出如下窗口,然后将所需要的插件的groupid,artifactid及版本号输入进去,根据准备工作中提及,分别是: de.akquinet.android.archetypes android-quickstart 1.0.6 如下图所示: 4、点击OK后,系统会去寻找相关的插件,然后选中此插件,再次点击Next,依次填入新工程的groupid, artifactid, package,如下图所示: 方法B: ...

2014年6月6日 · 1 分钟 · 天边的星星