android使用技巧
⑴ 第一次接触Android的系统,求推荐一些实用软件与游戏。 还有最好有关于新手使用Android系统的技巧,谢谢
【由布凯恰原创】
Android应用主要有几类,LZ要实用,我就撇开华而不实的咯:
输入法:
比较主流的android中文输入法有搜狗、Google和触宝,这块其实大同小异,个人推荐触宝,自带纠错功能,即使不小心按错键位的话,它也有很高的识别率,给出你原本想输入的词组,这个设计比较人性化。
拨号器、通话、短消息、联系人管理:
手机自带的拨号器和短消息管理程序功能很简单,有些应用可以强化这些方面的功能,比如提供来电和短信智能屏蔽、智能短信群发等等。
之前最流行的通话辅助应用是连云助手,但目前触宝智能拨号有赶超之势,功能一样齐全而强大,缺点是比较占用资源,配置低的话用着会卡机。
现在腾讯也出了一款“QQ通讯录”,其实是把拨号器、通话记录、联系人和短消息集成在同一个应用里,还有智能拨号匹配等功能,界面也比较美观,占用资源也较少,推荐。
短信息方面,如果你对界面不太在意的话,个人觉得没有非常有价值的应用;目前在用的,有一款SMS Popup,收到短信时可以直接在桌面上弹出窗口(即使在锁屏状态下),方便你马上处理;还有一款SMS Backup,可以把短消息自动同步到你的Gmail邮箱里,即使换了手机也可以很方便地导回来。
另外还有一款叫“蜡笔”的应用,号称能把你的通讯录、通话记录和短信全部同步到它的网站上,也可以试试。
拍照加强:
FxCamera和360Camera现在是用得最多的,这两个应用都集成了胶片、针孔、宝丽来等很多种照片特效,还挺逼真;如果要对拍好的照片进行简单编辑处理的话,可以用Picsay。
便签笔记:
AKNotepad的资格最老了,评价也很高,写完还可以直接作为邮件或者短信发给别人;不过我现在最青睐的是Catch,因为是英文版国内用得不多,它可以跟它的网站无缝同步,所以,你可以把别人在QQ上发给你的采购清单粘贴在Catch网站上,到了商场,联网打开Catch就行了,很方便。它还支持照片和网址存储!
记账:
推荐随手记,金蝶出品的,也分手机端和网页端,单独使用都是免费的,不过如果要开通二者同步的话,要出20块钱买VIP。用下来,20块的价格还是合理的。
浏览网页:
Wap可以用UC浏览器,Web则强力推荐Dolphin(海豚),特别是它的Mini版,绝对的No.1,Opera和FireFox也有Android端的浏览器,你可以试试,没海豚好用。
在线聊天和SNS:
聊天:QQ有官方版和aQQ,前者网络更稳定,后者功能略强一些,自己取舍吧;MSN则有Hi MSN;还有一款Meboo IM,集成了MSN、Google Talk和多个国外流行的IM协议,一个顶几个,也比较推荐的。
SNS应用基本是网站的移植就看你的需要了,各大微博、人人、开心、街旁,在android上都有官方和非官方的客户端。
生活助手:
天气预报:这个一定要有,国外的Fancy体验最好,国内的“墨迹天气”号称中文最强;
地图导航:把原装的谷歌地图升级到最新版,它已经足够强大了;还有中国地铁、Emo公交等可以作为辅助
消费指南:大众点评,和Google的“本地通”,帮助你找到周边的商户、银行等设施,还可以看到它们在地图上的位置和别人的点评。
媒体播放:
图片:JustPicture,反应飞快,界面也可以,推荐用来替代系统原装的图库。
视频:mVideoPlayer,不是最热门的,但是该有的功能全部到位,也不占系统。
音频:现在在用PlayerPro,界面和音质兼顾。
电子书阅读:
iReader:如果你喜欢纯粹的话,鼎力推荐这一款,而且是最老的版本。
文档浏览:
PepliGo Reader用来浏览Pdf,是神器级的。
OfficeSuite办公套件,用来浏览和编辑Office文档,也是神器级的。
系统辅助:
MyBackup(我的备份)可以用来定期备份你手机上所有的数据信息,更专业一点的有“钛备份”。
AdvancedTaskKiller:人气最高的进程杀手,一键释放内存。
RE管理器:它是一个拥有Root权限的资源管理器,你可以通过它来读写受保护的系统文件,不过很新手的话就不推荐了。
AppMonster:程序怪物,方便地管理和卸载你所有安装的应用。
游戏方面,重力感应的“愤怒的小鸟”现在最火,Doodle Jump(涂鸦跳)也不错,挺耐玩;还有一个叫做Alchemy的游戏,在市场上是五颗星,不过这是个考验记忆力、想象力和耐性的游戏,不是所有人都喜欢。
我已经尽可能地精简再精简了,如果LZ对哪方面的应用特别感兴趣,我再补充吧。
关于使用Android手机系统的技巧:
其实主要有三点
1,善用云同步
Android是谷歌开发的智能手机系统,其中的很多基础功能是和Google的互联网应用无缝衔接的,比如手机上的日程表、联系人、邮件、文档、阅读器还有地图等等,都可以找到对应的网络应用(你可以理解为网站),而且是双向同步,比如你在电脑上标注一下谷歌地图,打开手机地图的时候马上就能看到这个标记;你在手机上添加一个联系人,再打开GoogleContacts网页发现他已经在上面了。所以建议你先培养对Google这些网络产品的兴趣,Google的粉丝比别人更懂得Android的好处和乐趣。
相应地,不少Android应用都有可以将数据存储到远程的服务器上并访问(传说中的云同步),像账本、笔记等重要的应用,我都优先考虑有云端的,这样就不用怕数据丢失甚至硬件损毁,而且可以在手机、家用电脑、公司电脑等多个设备上及时访问和编辑。
2,控制电量和流量的消耗
不客气地说,不能上网的Android机相当于一台死机,所以建议你定一个适合自己的流量包月服务,并且对流量精打细算,善于发现那些喜欢偷偷跑流量的程序并进行控制,这一点,有不少流量监控的应用可以作为辅助;另一方面,Android不比超长待机的诺基亚,确实耗电,必须省着用,比如GPS和Edge不要一直开着,睡前把手机调到飞行模式等等;等你熟悉了它的性能后,就可以考虑通过设置CPU降频的方式来省电。
3,自我管理
善用Google和Android,可以自由地分配你自己的时间、行程和工作安排,可以在手机联系人生日的时候收到备忘提醒,可以获取最便捷的交通路线和找到附近最物美价廉的餐厅,可以随手记录你的想法和拍摄到的画面,而且不用怕它们丢失,大大提升你的效率;如果你不善用Android的话,它只是台能打电话的游戏机。所以,要真正地发挥Adroid的效能,关键还在于自己的修为。
--------------------
我级别低,贴网址的话恐被作为广告审核,请见谅,不过文中提到的应用都用了全称,方便LZ搜索。下载的渠道:原装的电子市场、豌豆荚(李开复的创新工场做的)、还有安卓网论坛和它开发的安卓市场(手机端),里面的应用来路相对比较正,而且有专人审核,确保没有恶意植入木马什么的,在其他网站下载就要格外小心。
⑵ 安卓系统快捷键的使用小技巧有哪些
1.全屏截图:当需要截图的时候,同时按住开机键和HOME键,这时就会听到咔嚓一声,屏幕就被截图了,当然这只适合简单快捷的截图,如果需要某一部分,还是需要第三方软件的。 2.长按HOME键:长按HOME键后会显示最近使用的程序和后台,这时我们通过这里来切换程序,也可以向左滑动直接关闭程序,简单快捷,还可以看到手机内存的使用情况,清理内存。 3.手机在锁屏状态下,如果QQ来消息,或是听歌曲的时候想进入播放软件,不用先解锁手机再进入,可以由上向下滑动任务栏,直接点击正在运行的软件,手机自动就会解锁。 4.音量条件键:使用音量键将声音调整最低就会切换为静音和振动,这样就可以省去点来点去的麻烦,简单快捷。 这里只为大家介绍几个简单使用的快捷键,也是工程师在日常使用中发现的,可能大家在日常使用中,还会发现更多快捷键,欢迎大家来分享。
记得采纳啊
⑶ 安卓系统使用教程
一,快速查看手机充电情况
方法1:通过待机屏幕查看,众所周知Android系统设计了自动锁屏功能,当手机处于一段时间不使用的情况下就会自动熄灭背景灯,如果需要激活的话就需要按下手机的Menu键两次,但是当按下第一次之后会显示出待机界面,里面就会显示目前的手机电池充电情况。
方法2:在Android系统中的AboutPhone选项中的“Status”选项,里面能够看到BatteryLevel的选项,这就是当前手机的充电情况显示。
方法3:通过第三方软件查看,由于Android系统中并没有专门的这类软件,所以如果想要详细的查看目前手机充电情况的话就是用一款第三方的电池查看软件吧
二,教你设置输入密码不可见
用过某些需要登录的应用程序的朋友相信都知道在输入账户密码默认情况下是显示出来已经输入的密码,为了安全起见都不想旁边的人看到自己的密码,那么怎样才能设置Android手机不可见已经输入的密码呢?教你设置输入密码不显示。
关于密码的设置当然是在SecurityLocation中了,所以我们先在主屏界面上按下Menu菜单键,在弹出的进阶菜单中选择最后一项“Settings”;
进入设置菜单后将滚动条向下滑动,找到“SecurityLocation”的分类,点击进入;
在安全性和位置分类菜单中找到Passwords分类,其中将“Visiblepasswords”选项后面的勾去掉即可。
三,Market下载失败解决办法
其实这样的问题在国外根本不存在,仅仅是在国内的朋友才会遇到这样的问题,这是因为貌似是国内将Google服务器屏蔽掉了,因此我们如果需要诸如YOUTUBE这样的服务时,只能“翻*墙”了。
设置静态IP的方法就能为各位网友解忧,该方法是Android123独创,配合了Google最新的服务,经过数十台Android手机均可以正常下载程序。
首先我们依次点选“Settings——wirelesscontrals——WIFISettings——Menu——Adbanced”勾选USEStaticIP这一项,并将DNS1设置为8.8.8.8,DNS2设置为8.8.4.4即可。
没错,上面讲到的方法正是利用了Google最新的DNS服务,填入之后其他不需要设置即可。
四,Droid铃声设置另类方法
我们在其他Android手机设置铃声的时候,一般采用的方法都是使用第三方软件(如TongPicker)设置,这样的设置方法有些繁琐,必须在相应的设置箱内启动该程序才能设置,Android123这次为你带来了使用自带铃声库的选择的方法。
这个方法简单的来讲就是在内置的TF卡中设置相对应的文件夹,该文件夹必须按照规定的名称设置,否则系统不会认出来。我们可以通过这样的设置来电铃声、短信铃声、闹铃和系统提示音的声音。
首先我们要在TF卡根目录中设立一个名为media的文件夹,在该文件夹中设置audio的文件夹,再在audio文件夹中设置其他相应的文件夹。
其中放置短信铃声的文件夹名称为notifications,放置闹铃铃声的文件夹为alarms,放置来电铃声的文件夹为ringtones,而系统提示音的文件夹名称为ui。
当文件夹设置后,将相对应的铃声文件放在相应的文件夹中即可。这样我们在Android系统的设置中就能直接看到这些铃声文件并进行选择了。
五,Android储存卡文件夹铃声不显示
Android手机设置铃声的方法有很多种,不过最常用的就是在SD卡上设置几个特定名称的文件夹,然后在文件夹中放置铃声文件,然后使用手机自带的铃声设置方法就能查看到SD卡中的铃声并选择了。不少的网友都说这样的方法并不能正常使用。在放置铃声后,却不能读取这些铃声文件。这是怎么回事?又该如何解决呢?
其实造成这样原因有多个,为你分析原因和解决方法。
首先就是铃声格式不支持的原因,目前的Android操作系统仅仅支持MP3和WMA格式的音频。因此其他格式的音频必须将其转换为这两种格式后才能被读取。
其次就是设置的文件夹名称错误,必须看好了。这里设置的文件夹名称分别为“notifications”和“ringtones”,保证首字母小写。
然后就是卡的问题,有些储存卡有质量问题,储存的文件会自动丢失。
最后还有手机ROM版本的问题,有些网友自制版本ROM对于SD卡的读取并没有经过优化,因此在选择到铃声选择界面后需要等待一会儿才会在Android系统的铃声选择菜单中出现。
六,Android手机批量删除联系人
有时候我们需要进行联系人的删除工作,尤其不是全删,而是由选择性的删除联系人,难道在Android手机中只能进行一个一个的手动删除吗?这也太麻烦了,如果多的话没有半个小时完成不了的。有什么简便的方法吗?
有,目前删除联系人有两种方法,第一种就是上面说的那样在手机上一个一个删除,另外一种就是利用Android手机绑定的Gmail账号会同步联系人到手机上,相反的Android手机上的联系人也可以选择同步到Gmail账号的联系人中。因此我们可以利用第二种方法进行快速的批量删除联系人操作。
具体操作步骤如下:在PC上进入Android手机上绑定的Gmail邮箱,在其中的联系人中进行删除联系人操作,删除完成后,再在手机上进行联系人同步即可。
七,Android手机WIFI连接上却不能上网问题
有些是用Android手机的用户会遇到这样的问题,当手机进行WIFI无线网络连接时,可以正常的连接上无线网络,而且信号非常好,但是却在使用某些需要网络支持的软件(比如Browser或Market)时却不能正常使用,存在较大的延迟。这是怎么回事呢?
首先我们按照惯例的分析造成这样的原因,造成这个症状的肯定不是因为密码错误,因为它可以连接上网,但是却有着很大的延迟。因此应该是WIFI的设置除了问题。
那么我们就进入Android手机中查看WIFI设置,发现没有什么可以进行设置的选项,因此应该就是无限路由器的设置问题。进入无线路由器设置,发现无线模式设置为混合模式,而目前生产的Android手机内置的WIFI模块是支持混合模式的,但是可能由于网络标准之间的切换出现问题,那么将无线路由器设置成为802.11g即可,当然802.11b也是可以的,只是速度稍慢。自此,WIFI连接上却不能上网问题圆满解决。
八,Android手机恢复出厂设置
作为一款智能操作系统,Android也内置了许多其他智能操作系统共有的功能,比如每部手机都必备的恢复出厂设置。那么Android手机该如何设置,才能让它正确的恢复出厂设置呢?
首先我们要明确的一点是恢复出厂设置这个功能并不是经常使用的,因为如果误操作引起的后果是非常严重的,恢复出厂设置从字面上就可以理解,手机中的所有设置将恢复到出厂状态,包括安装在手机上的软件、存储的联系人、接收的信息和Gmail,绑定的Gmail账号都将消失,完成后再次开机就会像刚首次开机一样需要初始化设置,绑定Gmail账号。因此这是手机遇到不可恢复的错误时才使用的功能,那么该如何操作呢?
这有两种方法,下面讲解第一种,首先进入手机的设置(Settings)中,选择SD卡和手机储存(SDCardphonestorage),再选择最后一项重设出厂数据(Factorydatareset)即可。
第二种方法是在Recovery模式下选择Wipedate即可,只要在启动时同时按下主页键和挂机键即可进入Recovery模式。
九,在桌面显示农历日期
作为一个中国人,我们在逢年过节都都会参照一下古代人发明的农历,不仅仅是因为它可以看出节气,也许这就是我们中国人的传统。那么使用Android手机可以在桌面上显示农历吗?
可以的。你们还记的Google提供的一个组件就叫做日历的,在PC***问Gmail和iGoogle都可以看到这款组件,另一方面Android手机与Google的各项服务都息息相关,当然这个日历组件也不例外,它可以同步用户的各项日程和记事,当Android手机打开WIFI后,会自动进行同步。另外手机上的日历可以在桌面上添加Widget,但是要经过一定的设置才能在桌面上显示农历信息。设置方法如下:
进入Android桌面的日历Widget,按下Menu键选择最后一项More,点击“Mycalendars”,再将农历选项勾选即可。
十,Android手机电池详细信息查看
在使用手机的过程中也许你会觉得电池的待机时间越来越短,难道是手机电池老化了吗?那么可以查看手机正在使用的电池信息吗?如果你使用的是智能手机,那么就可以实现,不过都是通过安装某些第三方电池测试软件来达到目的,如果你使用的是Android操作系统手机就不用这么麻烦了,因为手机已经自带了电池信息的查看,那么该怎样查看呢?
其实查看方法非常简单,直接进入Android的工程模式即可,操作步骤如下:
首先进入操作系统的拨号“Dialer”界面,输入“*#*#4636#*#*”(不加引号)即可快速进入Android的工程测试模式。在“Testing”菜单中有“Phoneinformation”、“Batteryinformation”、“Batteryhistory”、“Usagestatistics”四个选项,点击第二项“Batteryinformation”进入,然后既可以看到手机电池的详细信息了,其中包括电量等级、电池状态、温度、电池材质、电压等等信息
十一,怎样修改桌面文件夹的名称?
Android操作系统的桌面功能非常强大,不但可以防止程序的快捷方式,也可以放置各种Widget桌面组件,比如系统桌面的音乐播放器和模拟钟表等都算是Widget的一种,另外除了上述的那些组件,桌面上还能防止文件夹和联系人选项,这样将更为方便的管理系统各项程序快捷方式的分类和使用。就像是在PC上使用桌面文件夹一样简单。那么这个Android系统桌面文件夹可以像PC那样更改名称吗?
当然可以,而且更改起来非常方便。下面是具体操作步骤:
首先在桌面的空白处长按,在弹出的新建窗口中选择folder选项,再在进阶菜单中选择新建文件夹即可,点击桌面上的新文件夹,打开后按住文件夹的标题栏,即可出现重命名对话框,写入重命名并保存即可。
十二,怎样查看程序的历史运行时间?
Android操作系统是强大的,由于开源的性质因此没有什么好隐藏的,当然Android手机中的各种数据都是可以看到的,但是有些数据在正常模式下是看不到的,必须进入工程测试模式下查看。那么怎样才能进入系统的工程模式呢?
其实非常简单,不用同时按下什么组合按键,而是在拨号界面进行拨号即可。点击位于系统主屏的Dialer进入拨号界面,输入“*#*#4636#*#*”(不加引号)即可进入工程测试模式。这时可以看到出现了Testing的界面,包含了Phoneinformation、Batteryinformation、Batteryhistory、Usagestatistics四个选项,如下图,如果需要查看程序的历史运行时间,直接点击最后一项Usagestatistics即可进入其分类,将上方的Sortby选择为UsageTime即可。下方列出的列表信息就是各个程序的历史运行时间。
十三,Android系统通用技巧合集
作为一款智能操作系统,快捷键和技巧是必不可少的,之前本站也已经介绍过多个Android操作系统使用技巧。
1.首先就是最常用的技巧之一,长按Home键可以调出最近使用的6个程序,并将当前程序置入后台运行
2.调整音量至最低,就会依次进入振动模式和电话铃声静音
3.长按挂机键,在弹出的进阶菜单中可以选择飞行模式、静音模式和关机,但是值得一提的是,这里的静音室完全静音,音乐盒游戏都没有声音。
4.输入英文时,删除一个词就可以同时按下Menu键和Del键,这样的操作并不是只删除一个字母。
5.在短信菜单中,长按某条短信会调出进阶菜单,选择相应的选项即可将此短信转发或回复。
6.长按接听键,会自动激活系统的语音拨号功能,但是需要注意的是这里的语音仅能识别英文,即使刷了中文操作系统也不行。
7.在SDcard里建立诸"Ringtones""Alarms""Notifications"等文件夹,再将将铃声文件(ogg,mp3,wav,mid等)放进去,系统选择铃声的选项中就多出了这些音乐文件。
十四,Android手机WIFI问题集合
现在市面上的Android手机基本都是海外发行,因此都带有WIFI功能,非常方便,另外由于Android系统的依靠于网络才能发挥其方便快捷的特点,因此WIFI也是其不可分割的一部分。那么该如何设置呢?
首先在系统主屏界面下按下Menu键,选择最后一项Settings(设置),依次进入Wirelesscontrols(无线控制)——Wi-Fisettings(WIFI设置),将Wi-Fi勾选,再将Networknotification(网络提示)打开,系统会自动进入搜索网络状态,稍等片刻搜索完毕点击可用网络,如果有密码,输入密码点击连接即可。
在WIFI日常的使用中会经常遇到一些问题,比如已连接却不能上网等,这些很有可能是因为其他的一些原因导致,大致可以分为两类,一类是程序设置问题,基本存在与密码不对等情况。另一位是硬件问题,很可能是因为路由器固件较老不能很好的发送信号等,用户可以根据自身情况逐一排除。
十五,插入TF卡时显示FormatSDcard怎么办?
当插入新买的TF卡时会显示“FormatSDcard(格式化SD卡)?”的提示出现,那么该怎么解决呢?
其实这是在Android1.5之后的系统版本中才会出现的功能,就像将新SD卡插在安装有Windows操作系统的电脑中,会提示需要格式化一次一样,只需要将TF卡按照提示格式化即可,当然,这只是全新卡的做法。如果卡中有重要资料,请先在电脑上备份后在在Android手机上进行格式化。
当选择OK时,会弹出“?Alldataonyourcardwillbelost”的提示,意为“您确定格式化SD卡,所有卡上的数据将会丢失”,单击Format(格式化)即可进行格式化操作,Android手机会自动在格式化完成后建立系统默认文件夹。
十六,提高Android手机GPS搜星速度方法
目前使用的T-MobileG1、HTCMagic手机中使用的GPS芯片均为SIRF提供的star第三代导航模块,不过在冷启动搜星速度方面表现的较一般在户外需要30~50秒左右的时间。提供搜星速度成了一个重要的话题,从Android1.5固件开始加入了A-GPS辅助定位功能,可以缩短这一时间仅为10秒左右。但需要GPRS流量辅助。
A-GPS的原理主要是通过服务器位置信息辅助方式提高GPS搜索卫星的速度,但是需要花费GPRS流量在5KB-10KB左右
⑷ Android手机使用技巧
作为一款智能操作系统,快捷键和技巧是必不可少的,下面我就告诉你一些Android操作系统使用技巧。
记得采纳啊
⑸ Android系统有哪些实用小技巧
1ROOT了卸载不需要的系统自带的软件
2安装LBE控制各种软件的权限
⑹ android系统有哪些开发者小技巧
下面是开始Android编程的好方法:
找一些与你想做事情类似的代码
调整它,尝试让它做你像做的事情
经历问题
使用StackOverflow解决问题
对每个你像添加的特征重复上述过程。这种方法能够激励你,因为你在保持不断迭代,不经意中你学到了很多。然而,当你发布应用时你还要做一些更深入的事情。
从一些可正常工作的代码到一个可怕的应用程序是一个巨大的跳跃,相比iOS平台Android更是如此 。当在iOS上发布应用时只是在一个设备上跳跃–你的手机–对很多设备而言都很相似–同样大小的屏幕,都有很好的硬件,95%上运行相同版本的操作系统。在Android应用中你不会遇到这种情况。
你的程序必须能够处理一切:从屏幕,处理器,定制的操作系统,API层级以及任何其他的特定设备。
这是我对使Android应用舒服起来的个人建议。
目标屏幕尺寸及解决方法
在Android世界里目前有超过100种的不同屏幕尺寸,但解决方法也很丰富。为使你的应用适应不同的屏幕配置有两件事情你需要确定:
你对不同的屏幕尺寸有一个好的布局和结构
你的图像在不同分辨率下工作良好
这些都是独立的任务,你可能有一个超级的tablet布局,但上面的图形看起来很糟糕。我们会依次讨论他们。
为不同的屏幕而设计
1.通常会用ScrollView 和 ListView 轻松搞定
当我们有一系列不同尺寸的大屏手机时,它们之间最大的不同就是屏幕的高度。因此ScrollView和ListView通常可是有效的工作,虽然有时它们并不能完全覆盖全部屏幕。在OpenSignal中的Dashboard标签下我们可以看到所有部件一气呵成,不存在滑动、对于许多高级类型标签中,滑动展示并不见得是一件坏事。如果你能够为你所有的设计匹配到各种屏幕上面去,那么最好不过。否则,这两个控件会让你用最小的开发代价来保证你的软件在大多数屏幕上正常展示。
Dashboard style 的设计不需要scroll
2: 使用文件夹. Android 的资源文件夹结构非常强大, 它允许开发者将不同的图片、字符串、布局文件、外形、颜色这些资源,在api、代码、屏幕尺寸等部分. 下面是一个例子,展示了在资源文件夹下你可以怎样做:
在 values-small 文件夹中存放了一个 bools.xml 文件, 文件中有如下几行代码:
<resources>
<bool name="small_screen">true</bool>
</resources>
在代码中我可这样引用:
if(getResources().getBoolean(R.bool.small_screen)){
getSupportActionBar().hide();
}
在小尺寸设备中boolean值将置为true 我此时将因此ActionBar来节省空间. 这段代码正是非凡的ActionBarSherlock 扩展库中的一部分,稍后再详细介绍. 在values-sw360dp文件夹中,存放对应屏幕宽于360dp的资源文件。与上面相同的位置,有如下代码
<resources>
<bool name="small_screen">false</bool>
</resources>
对于大屏幕而言,ActionBar就置为了显示状态.
我不需要将 bools.xml 文件放入 values-sw400dp文件夹中, 因为操作系统会自动按相应路径搜索. 例如一个设备宽 600dp (600/160=3.75 英寸, 这就是我们通常所说的7片装) 操作系统会在values-sw600dp 和其包含的的文件夹中搜索 bools.xml 文件, 若没有找到则搜索 values-sw400dp 文件夹,在搜索 values-sw360dp 文件夹以此类推.
建议3:160dp = 1英寸。320 dp = 2英寸。dp = dip
建议4:你可以用这些目录结构技巧来应付所有资源类型,比如你的XML布局用指定的系统目录名称
来解决这个问题,如:layout-sw360dp目录可以匹配目标宽是360dp的机器。如果你也要支持横竖屏布局切换的话,可以用如下目录:
layout-sw360dp-land
layout-sw360dp-port
别急,你有一半的用户是说阿拉伯语的?那就将布局名称改为下面的样子吧:
layout-sw360dp-land
layout-sw360dp-port
layout-sw360dp-land-ar
layout-sw360dp-port-ar
前两个可以适用于所有语言,-ar代表阿拉伯语。
建议5:资源规则简介:
XXX //例子:没有添加目录名:默认-适用于Nexus One,Droid 2,S2
XXX-sw360dp // 比较大的手机 – Galaxy Nexus, S3, S4
XXX-sw600dp // 7〃 平板
XXX-sw720dp // 10” 平板
在Kindle设备有些不同,如下:
XXX-large-mdpi // kindle fire 7〃
XXX-large-hdpi // kindle fire 7〃 HD
建议6:如果你不想裁剪所有的布局文件,你可以用dimens.xml文件。你要是留心我上面的文章,你就会注意到在我的values目录里有很多dimens.xml,这样是因为我更喜欢在一个layout.xml里设置值,在每一个布局文件里我喜欢这样做:
<ImageView
android:layout_centerHorizontal="true"
android:layout_marginTop="@dimen/small_margin"
android:layout_width="@dimen/dashBoardWidth"
android:layout_height="@dimen/dashBoardHeight"
android:id="@+id/dashboard"/>
small_margin是在dimen.xml文件里定义的:
<resources>
<dimen name="small_margin">4dp</dimen>
</resources>
这个4dp变量在所有dimen文件里。我有个Excel文件,里面创建了所有不同的基于不同因素所需的尺寸定义。也许你会问:为什么不让android OS来处理所有尺寸的问题?为什么不呢,为什么不用一个values目录和一个布局目录来代替所有写死的数值呢?那当然是可以的,如果设置得当,都会得到所有的尺寸,但是对于有些元素看起来就不是那么好计算尺寸了。
建议7:让空白空间大于图像空间。让图像空间大于按钮的大小。如果将按钮,多选框,切换控件放大后是很丑陋的。一个100dip(0.63")大小的按钮是不想在平板上显示为原来两倍宽度200dip(1.25")的.原因是屏幕变大了,这不是说平板是给巨人用的。我们可以这样做,在按钮增加的空间和图片扩展的空间里添加空白。
建议8:用GraphicalLayout工具快速预览。GraphicalLayout是WYSIWG XML编辑器。我喜欢直接编写元素-而不是拖,丢弃的可见编程方式,但在添加一些元素之后,可以在GraphicalLayout的下拉选择菜单里选择不同屏幕尺寸进行测试。
这里有很多选项供你选择。
图片缩放
建议9:不要把所有的图片都缩放了。用布局文件来适应不同屏幕尺寸的方法只是成功的一半,布局里的元素(如:图片)也要能在高分辨率的屏幕下良好工作。在概念上比较简单的方式就是创建一套完整的图片目录并将它们与很多drawable目录匹配起来。
drawable-sw600dp-ldpi
drawable-sw600dp-mdpi
drawable-sw600dp-hdpi
drawable-sw600dp-xhdpi
drawable-sw600dp-xxhdpi
...其它的类似。
不要这样做:
你不要太尽信书了。
一般来说有drawble-ldpi, drawable-hdpi等目录就足够了,不需要将所有的情况都加上。
建议10:避免使用位图(jpg,png)。对于一些图标来说,用位图是个不错的选择,因为它们使用简单。但是如果可以避免使用位图,你可以节省很多空间。但用不同的方法也可以达到很好的结果。
建议11:用XML绘图。位图都可以用XML绘图来代替的。XML绘图不是万能的,但是它的方便性还是使我感到惊讶。Android开发文档中有详细的介绍,这里有个简单的例子:
这里是定义了一个圆角矩形,一个有渐变的边(深蓝)。你可以在布局文件的任何地方来引用,而且它可以适应于任何屏幕。用它可以做出理想的按钮。
建议12:用更多的XML绘图。再来介绍一个用XML绘图制作出能更加让你兴奋的例子,下面的雷达背景看起来是不是更加的复杂:
不用位图对你的UI是没有坏处的(除过图标)。
建议13:仍然用更多的XML绘图(如果必须,就用位图)。那我们怎样为天气信号构建一个超酷的图标-让灯泡动态的依据光的强度来进行自动填充,以及怎么点击指针后让其旋转呢?这里我们用位图和XML结合起来做个例子:
灯泡我们用PNG图:icon_magnitude_min(一个空的灯泡)和icon_magnitude_max(充满光的灯泡),然后我们动态的裁剪后者。为了实现这个目标我是这样做的:
在java程序中我将得到回形针的引用,然后可以用它来控制光的强度。
建议14: 为什么要用9-patch (当你可以用XML drawables的时候)? Android具有使用9-patches 来定义drawables的选择,有些教程阐述了怎样用它们来做一个按钮,这样可以在伸展的时候保持几个角不变 (并且避免了像素处理)。如果你已经知道怎样使用9-patches,可能是从web设计中学会的,那么它们或许值得一用。如果你对9-patches并不熟悉,我建议你维持原样。如果你想适应什么东西——例如拐角的圆弧或者颜色,创建9个小块要比创建位图更多被涉及,这就像回到了图像编辑器的时代。许多用9-patches获得的效果也可以通过XML获得。
建议15: 通过覆盖onDraw()创建自定义views. 有些事情XML并不十分在行,我们在OpenSignal和WeatherSignal中画过许多图像,为此有许多的库,但是我们要为自定义图像自己编写代码。这很有趣。或许你永远也不需要做这个,但为了使图像高度动态并自定义,这经常是唯一可行的办法。
建议16:在不能使用XML的地方使用SVG. 有时候复盖onDraw()并勤勤恳恳的为自定义view编写代码画出需要的线条与弧线是过于技术化了。毕竟有一种矢量图像语言,它称作…Scalable Vector Graphics(可扩展矢量图形)。它也是史上最酷的Android应用之一—Androidify的动力来源。事实上他们创建这个库就是为了那款应用,他们将它发布在这里:SVG for Android 。这也就是我们在OpenSignal中画仪表盘所用到的。
建议17: 对SVG文件GZip压缩. 将它们变得更小它们就会处理的更快。
建议18: SVG库并不是支持一切. 在一些特定的alpha通道中似乎不能正常工作,你甚至不得不在代码中将它们剔除。
达到在android所有版本里表示展现一致的目标
建议19:在一些android系统里(如TouchWhizz/HTC Sense/MotoBlur等等),默认的buttons和其他UI组件会跟原生系统里的看起来差别很大。我希望这不是真的,但事实却是如此。
建议20:自定义你的UI组件。为了确定你的app在所有的设备里看起来是一致的,你将需要自定义所有的东西。这其实没有你想象中那么难,只要你做到了,你将能更加好地把握到你的app的展示外观。
建议21:Selectors是创建buttons的利器。我们在上面提到了如何在XML里定义button的背景,但是你将如何创建一个当按下去会改变的button呢?很简单:像下面那样在xml文件里定义背景。该xml文件将接收到button当前状态并且在外观上做出相应的改变。
建议22:在Honeycomb之前的版本里时不存在ActionBar跟很多 animation 样式的,所以可以使用ActionBarSherlock 跟NineOldAndroids来代替。Jake Wharton写的Android开源 组件都是往下兼容的精心杰作。更为惊喜的是,ABS 拥有强大的功能用来定义ActionBar。
把速度作为目标
建议23:在运行慢的手机上测试。你将在运行慢的手机上发现很多问题,同时它让你抓狂,没人会喜欢运行慢的程序。
建议24:尽量减少XML布局层次。更多的层次意味着系统将为解析你的代码付出更多的工作,这将会让图像渲染的更慢。
建议25:用Android Lint。在工程目录上右键选择Eclipse>Android Tools>Run Lint。它将会得到程序的一些信息,并能提高程序的运行速度,或者它能让你得代码更加清爽。
建议26:Android Lint可以得到错误信息。它可以给你的代码提供很详细的信息,并在你出错之前就可以给做出提示。
建议27:用<merge>可以帮助你减少视图层次结构。这是一种简单的方式来去除多余的层次。好的文章都对此有所解释,而且在 Android Developer中它也显得与众不同。
建议28:用HierarchyViewer可以直观的看到你布局的层次。这个智能的工具可以显示布局中有多少层次,而且可以提示出那些可以让程序变慢。
建议29:如果可以尽量用RelativeLayout。AbsoluteLayout已经过期了,就不要用了。你经常会遇到在RelativeLayout和LinearLayout中做出选择的情况,那就直接用RelativeLayouot吧,因为它可以让你减少视图层次。比如,你想实现一个如下视图:
盒子 A 在屏幕左半边 |盒子 B在屏幕右半边
你首先会想到这么做:
<LinearLayout
android:layout_width=”match_parent”
android:layout_height=”wrap_content”
android:orientation=”horizontal”
>
<TextView
android:text=”Box A takes up left half of the screen”
android:layout_width=”0dip”
android:layout_height=”wrap_content”
android:layout_weight=”1″
/>
<TextView
android:text=”Box B takes up left half of the screen”
android:layout_width=”0dip”
android:layout_height=”wrap_content”
android:layout_weight=”1″
/>
</LinearLayout>
That works just fine, but you could also use:
<RelativeLayout
android:layout_width=”match_parent”
android:layout_height=”wrap_content”
android:orientation=”horizontal”
>
<TextView
android:text=”Box A takes up left half of the screen”
android:layout_width=”match_parent”
android:layout_height=”wrap_content”
android:layout_toLeftOf=”@+id/mmy_center”
/>
<View
android:id=”@+id/mmy_center”
android:layout_width=”0dip”
android:layout_height=”0dip”
android:layout_gravity=”center”
/>
<TextView
android:text=”Box B takes up left half of the screen”
android:layout_width=”match_parent”
android:layout_height=”wrap_content”
android:layout_toRightOf=”@+id/mmy_center”
/>
</RelativeLayout>
第二个表单比第一个难看的多,事实上是相当的糟糕:我们已经介绍过一个完整的新元素了。但是假如我们要给每个盒子里加入一个图片,一般的我们将这样做:
盒子 A 在屏幕左半边 图片|盒子 B在屏幕右半边 图片
用第一中方法,你得创建一个有两个层次的LinearLayout,如果用第二种方法,你可以直接在同一个RelativeLayout中加入图片,比如要指定第一个图片必须在“mmy_center”的左边,而且一个TextView A必须也在其左侧。那么你就得用7个元素3个视图层次了(LinearLayout 方式),而(RelativeLayout方式)只用6个元素2个层次,这样所有的工作添加完成。
建议30:用一些扩展工具如DDMS。这可以帮助你发现一些不必要的网络调用、查看电池使用量、垃圾回收信息,状态变化(例子:当回调onStop和onDestroy时)等。LittleEye是我目前比较喜欢的工具。
建议31:用AsyncTasks。Anroid工程团队受够了人们经常在UI线程里面实现网络调用(译注:耗时操作,容易阻塞UI刷新),所以他们实现了一些可产生编译级错误信息的API。但是仍然在很多app中的一些工作会拖垮UI线程,我们要考虑到UI布局要快以及提高UI的响应性。
目标机器空间小
建议32:一些Aandroid设备有100mb空间大小的限制。现在情况已有变化了,但是仍然有很多用户还会担心5Mb大小的app会浪费空间。如果你可以选择将app装入SD卡的话,这就不是问题了,但如果你的app需要在onBoot里启动的话你就不能装入SD卡了(例子:如一些窗体小部件).甚至对于一些新的设备,如果能很快的下载一个小的APK的话,用户还是很高兴的。
建议33:用XML资源(我发誓上次我已经提醒过了),这将比PNG资源节省很多空间,当你仅仅需要一个可以满足很多屏幕大小的配置时,一个XML文件会比能实现同样功能的PNG省空间。
建议34:如果要用PNG,最好优化一下(用PNGCrush或ImageOptim)
目标bugs
建议35:在Android开发者控制台里检查所有被自动检测出来的bugs.
建议36: ProGuard现在是默认启动着的. Proguard太好用了 (提高你app的速度和降低文件大小),但这也让StackTraces 非常难以处理。你将需要重新追踪你的StackTraces,因此你将需要继续保留在每次构建中创建的Proguard的映射文件。我把它们都放到以代码版本号命名的文件夹里。
建议37: 为了显示StackTraces里的行数,你需要修改ProGuard的配置。确认你的proguard.cfg拥有下面这句话:
-keepattributes SourceFile,LineNumberTable
建议38:使用staged rollouts。测试5%的基础用户,并且观察bug报告。
建议39:使用真实设备测试平台。Device Anywhere and Perfecto Mobile提供了虚拟测试平台,在那里,你可以使用真正的移动设备。我发现他们有一些笨拙,加入连续不断地进行测试的话,会导致有一些糟糕的情况。如果你在联合办公的环境里工作,或者有一些Android开发的好友,那么去启动一个“设备池”吧。
建议40: 多写代码少写博客。其实不是的, 分享就是关爱, 我只是想不出第40条写什么是了。
⑺ 求安卓系统的资料以及常用技巧
http://wenku..com/view/ad9f1ef19e314332396893f0.html
http://wenku..com/search?word=%D7%BF%CF%B5%CD%B3%B5%C4%D7%CA%C1%CF%D2%D4%BC%B0%B3%A3%D3%C3%BC%BC%C7%C9&lm=0&od=0&fr=top_home
⑻ Android上有哪些不为人知的技巧 福利贴②
一、【如何找出安卓手机所连接过的WiFi密码】
第一步:安装“RE管理器”;
第二步:打开RE管理器,进入data/misc/wifi;
第三步:找到bcm_supp.conf或wpa_supplicant.conf文件并打开;
第四步:保存过的WIFI账号和密码一目了然了。ssid=后面是WIFI网络名,psk=就是相应的密码。
二、极度充分利用手机内存
1.利用钛备份清理。
进入钛备份文件(必须为专业版。)
准备就绪后点击手机左键,然后找到清理dalvik(无用的虚拟内存),如果有,选择清理。
2.利用钛备份整合dalvik进系统。
重复上面操作。找到整合dalvik进系统。
如果有可以整合的,保证系统内存足够!
一般来说,没有用过此功能的第一次可以空出许多手机内存!
3.利用钛备份转移软件进系统。
打开钛备份,找到想要转移的软件(尽量不要转游戏),然后往左轻轻一划,会出现相关页面。再点击转换为系统文件既可
。
推荐用钛备份6.0.2.1专业版
(6.03专业版有bug,不推荐使用)
三、手动转移软件进系统。
先将软件安装至手机!
然后在data/app找到软件,移动至system/app文件夹,修改权限未三读一写!即:
√√
√
√
第三行不要打勾!
移动完成后,长按软件,选择查看。
找到软件里面的lib文件夹,并且全部解压。再将里面带.so的文件移动至system/lib文件夹,不需要修改权限。
重启既可!
四、清理无用文件!
这个最实用!
用re管理器进入data文件夹。找到以下子文件:
dalvik-cache
local
log
lost+found
tombstones
把里面的文件全部删除!
没错,全部删除!
之后你会发现你的手机完蛋了,不用担心,立刻重启。然后等十几分钟完美解决。手机内存多了好多有木有!
五、手机提示“SD卡已损坏,可能需要重新格式化卡” 的解决办法!!!
1.拔下手机上的SD卡,插入读卡器,插入电脑USB接口,电脑上显示出可移动磁盘。
2.打开 开始-运行-CMD。
3.在CMD里运行“chkdsk /f h:”(h是我SD卡的盘符,你的如果是f盘,就写f)。
4.按回车键,就开始修复(过程可能要几分钟)。
5.修复后,右键SD卡属性-工具-开始检查-把“自动修复文件系统错误”和扫描并尝试恢复坏扇区”两项都打上“?”。
6.把SD卡插回手机,你就会发现该问题已经成功解决了。
⑼ 有哪些android开发技巧
1、android:clipToPadding
意思是控件的绘制区域是否在padding里面。默认为true。如果你设置了此属性值为false,就能实现一个在布局上事半功陪的效果。先看一个效果图。
上图中的ListView顶部默认有一个间距,向上滑动后,间距消失,如下图所示。
如果使用margin或padding,都不能实现这个效果。加一个headerView又显得大材小用,而且过于麻烦。此处的clipToPadding配合paddingTop效果就刚刚好。
同样,还有另外一个属性也很神奇:android:clipChildren,具体请参考:【Android】神奇的android:clipChildren属性
2、match_parent和wrap_content
按理说这两个属性一目了然,一个是填充布局空间适应父控件,一个是适应自身内容大小。但如果在列表如ListView中,用错了问题就大了。ListView中的getView方法需要计算列表条目,那就必然需要确定ListView的高度,onMesure才能做测量。如果指定了wrap_content,就等于告诉系统,如果我有一万个条目,你都帮我计算显示出来,然后系统按照你的要求就new了一万个对象出来。那你不悲剧了?先看一个图。
假设现在ListView有8条数据,match_parent需要new出7个对象,而wrap_content则需要8个。这里涉及到View的重用,就不多探讨了。所以这两个属性的设置将决定getView的调用次数。
由此再延伸出另外一个问题:getView被多次调用。
什么叫多次调用?比如position=0它可能调用了几次。看似很诡异吧。GridView和ListView都有可能出现,说不定这个祸首就是wrap_content。说到底是View的布局出现了问题。如果嵌套的View过于复杂,解决方案可以是通过代码测量列表所需要的高度,或者在getView中使用一个小技巧:parent.getChildCount == position
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (parent.getChildCount() == position) {
// does things here
}
return convertView;
}
3、IllegalArgumentException: pointerIndex out of range
出现这个Bug的场景还是很无语的。一开始我用ViewPager + PhotoView(一个开源控件)显示图片,在多点触控放大缩小时就出现了这个问题。一开始我怀疑是PhotoView的bug,找了半天无果。要命的是不知如何try,老是crash。后来才知道是android遗留下来的bug,源码里没对pointer index做检查。改源码重新编译不太可能吧。明知有exception,又不能从根本上解决,如果不让它crash,那就只能try-catch了。解决办法是:自定义一个ViewPager并继承ViewPager。请看以下代码:
/**
* 自定义封装android.support.v4.view.ViewPager,重写onInterceptTouchEvent事件,捕获系统级别异常
*/
public class CustomViewPager extends ViewPager {
public CustomViewPager(Context context) {
this(context, null);
}
public CustomViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
try {
return super.onInterceptTouchEvent(ev);
} catch (IllegalArgumentException e) {
LogUtil.e(e);
} catch ( e) {
LogUtil.e(e);
}
return false;
}
}
把用到ViewPager的布局文件,替换成CustomViewPager就OK了。
4、ListView中item点击事件无响应
listView的Item点击事件突然无响应,问题一般是在listView中加入了button、checkbox等控件后出现的。这个问题是聚焦冲突造成的。在android里面,点击屏幕之后,点击事件会根据你的布局来进行分配的,当你的listView里面增加了button之后,点击事件第一优先分配给你listView里面的button。所以你的点击Item就失效了,这个时候你就要根据你的需求,是给你的item的最外层layout设置点击事件,还是给你的某个布局元素添加点击事件了。
解决办法:在ListView的根控件中设置(若根控件是LinearLayout, 则在LinearLayout中加入以下属性设置)descendantFocusability属性。
android:descendantFocusability="blocksDescendants"
官方文档也是这样说明。
5、getSupportFragmentManager()和getChildFragmentManager()
有一个需求,Fragment需要嵌套3个Fragment。基本上可以想到用ViewPager实现。开始代码是这样写的:
mViewPager.setAdapter(new CustomizeFragmentPagerAdapter(getActivity().getSupportFragmentManager(), subFragmentList));
导致的问题是嵌套的Fragment有时会莫名其妙不显示。开始根本不知道问题出现在哪,当你不知道问题的原因时,去解决这个问题显然比较麻烦。经过一次又一次的寻寻觅觅,终于在stackoverflow上看到了同样的提问。说是用getChildFragmentManager()就可以了。真是这么神奇!
mViewPager.setAdapter(new CustomizeFragmentPagerAdapter(getChildFragmentManager, subFragmentList));
让我们看一下这两个有什么区别。首先是getSupportFragmentManager(或者getFragmentManager)的说明:
Return the FragmentManager for interacting with fragments associated with this fragment's activity.
然后是getChildFragmentManager:
Return a private FragmentManager for placing and managing Fragments inside of this Fragment.
Basically, the difference is that Fragment's now have their own internal FragmentManager that can handle Fragments. The child FragmentManager is the one that handles Fragments contained within only the Fragment that it was added to. The other FragmentManager is contained within the entire Activity.
已经说得比较明白了。
6、ScrollView嵌套ListView
这样的设计是不是很奇怪?两个同样会滚动的View居然放到了一起,而且还是嵌套的关系。曾经有一个这样的需求:界面一共有4个区域部分,分别是公司基本信息(logo、名称、法人、地址)、公司简介、公司荣誉、公司口碑列表。每部分内容都需要根据内容自适应高度,不能写死。鄙人首先想到的也是外部用一个ScrollView包围起来。然后把这4部分分别用4个自定义控件封装起来。基本信息和公司简介比较简单,荣誉需要用到RecyclerView和TextView的组合,RecyclerView(当然,用GridView也可以,3列多行的显示)存放荣誉图片,TextView显示荣誉名称。最后一部分口碑列表当然是ListView了。这时候,问题就出来了。需要解决ListView放到ScrollView中的滑动问题和RecyclerView的显示问题(如果RecyclerView的高度没法计算,你是看不到内容的)。
当然,网上已经有类似的提问和解决方案了。
给一个网址:
四种方案解决ScrollView嵌套ListView问题
ListView的情况还比较好解决,优雅的做法无非写一个类继承ListView,然后重写onMeasure方法。
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}
ListView可以重写onMeasure解决,RecyclerView重写这个方法是行不通的。
说到底其实计算高度嘛。有两种方式,一种是动态计算RecycleView,然后设置setLayoutParams;另外一种跟ListView的解决方式类似,定义一个类继承LinearLayoutManager或GridLayoutManager(注意:可不是继承RecyclerView),重写onMeasure方法(此方法比较麻烦,此处不表,下次写一篇文章再作介绍)。
动态计算高度如下:
int heightPx = DensityUtil.dip2px(getActivity(), (imageHeight + imageRowHeight) * lines);
MarginLayoutParams mParams = new MarginLayoutParams(LayoutParams.MATCH_PARENT, heightPx);
mParams.setMargins(0, 0, 0, 0);
LinearLayout.LayoutParams lParams = new LinearLayout.LayoutParams(mParams);
honorImageRecyclerView.setLayoutParams(lParams);
思路是这样的:服务端返回荣誉图片后,由于是3列显示的方式,只需要计算需要显示几行,然后给定行间距和图片的高度,再设置setLayoutParams就行了。
int lines = (int) Math.ceil(totalImages / 3d);
至此,这个奇怪的需求得到了解决。
可是在滑动的时候,感觉出现卡顿的现象。聪明的你肯定想到是滑动冲突了。应该是ScrollView的滑动干扰到了ListView的滑动。怎么办呢?能不能禁掉ScrollView的滑动?
网络一下,你肯定能搜索到答案的。先上代码:
/**
* @author Leo
*
* Created in 2015-9-12
* 拦截ScrollView滑动事件
*/
public class CustomScrollView extends ScrollView {
private int downY;
private int touchSlop;
public CustomScrollView(Context context) {
this(context, null);
}
public CustomScrollView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public CustomScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
touchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
}
@Override
public boolean onInterceptTouchEvent(MotionEvent e) {
int action = e.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
downY = (int) e.getRawY();
break;
case MotionEvent.ACTION_MOVE:
int moveY = (int) e.getRawY();
if (Math.abs(moveY - downY) > touchSlop) {
return true;
}
}
return super.onInterceptTouchEvent(e);
}
}
只要理解了getScaledTouchSlop()这个方法就好办了。这个方法的注释是:Distance in pixels a touch can wander before we think the user is scrolling。说这是一个距离,表示滑动的时候,手的移动要大于这个距离才开始移动控件,如果小于此距离就不触发移动。
看似很完美了。
但是还有另外一个问题:我每次加载这个界面花的时间太长了,每次由其它界面启动这个界面时,都要卡上1~2秒,而且因手机性能时间不等。并不是由于网络请求,取数据由子线程做,跟UI线程毫无关系。这样的体验自己看了都很不爽。
几天过去了,还是那样。马上要给老板演示了。这样的体验要被骂十次呀。
难道跟ScrollView的嵌套有关?
好吧,那我重构代码。不用ScrollView了。直接用一个ListView,然后add一个headerView存放其它内容。因为控件封装得还算好,没改多少布局就OK了,一运行,流畅顺滑,一切迎刃而解!
本来就是这么简单的问题,为什么非得用ScrollView嵌套呢?
stackoverflow早就告诉你了,不要这样嵌套!不要这样嵌套!不要这样嵌套!重要的事情说三遍。
ListView inside ScrollView is not scrolling on Android
当然,从android 5.0 Lollipop开始提供了一种新的API支持嵌入滑动,此时,让像这样的需求也能很好实现。
此处给一个网址,大家有兴趣自行了解,此处不再讨论。
Android NestedScrolling 实战
7、EmojiconTextView的setText(null)
这是开源表情库com.rockerhieu.emojicon中的TextView加强版。相信很多人用到过这个开源工具包。TextView用setText(null)完全没问题。但EmojiconTextView setText(null)后就悲剧了,直接crash,显示的是null pointer。开始我怀疑时这个view没初始化,但并不是。那就调试一下呗。
@Override
public void setText(CharSequence text, BufferType type) {
SpannableStringBuilder builder = new SpannableStringBuilder(text);
EmojiconHandler.addEmojis(getContext(), builder, mEmojiconSize);
super.setText(builder, type);
}
EmojiconTextView中的setText看来没什么问题。点SpannableStringBuilder进去看看,源码原来是这样的:
/**
* Create a new SpannableStringBuilder containing a of the
* specified text, including its spans if any.
*/
public SpannableStringBuilder(CharSequence text) {
this(text, 0, text.length());
}
好吧。问题已经找到了,text.length(),不空指针才怪。
text = text == null ? "" : text;
SpannableStringBuilder builder = new SpannableStringBuilder(text);
加一行判断就行了。
先想到这么多,以后再补充。