十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
大家都知道用 ctrl + F 可以在文件中查找一些字段。Android Studio不仅支持在本文件中查找,还可以在不同范围内查找。
建网站原本是网站策划师、网络程序员、网页设计师等,应用各种网络程序开发技术和网页设计技术配合操作的协同工作。成都创新互联专业提供网站设计制作、成都网站建设,网页设计,网站制作(企业站、响应式网站、电商门户网站)等服务,从网站深度策划、搜索引擎友好度优化到用户体验的提升,我们力求做到极致!
方法
全局查找:Edit -Find -Find in path
全局替换: Edit -Find - Replace in path
之后会跳出一个弹框
Text to find 中输入需要被替换的内容,Replace with中输入替换内容,General中可以选择是否区分大小写,Context可以选择内容出现的位置:所有地方,在注释中,注释之外等等。
Scope是查找范围,可以选择整个项目,某个模块,某个路径,或者某个文件,使用起来非常灵活。
Options右侧的Preview还可以预览搜索结果。棒棒哒!
很多人觉得Android手机的拍照功能不如苹果,但事实上,许多Android手机配备了高质量摄像头,只要掌握正确方法,用手机拍出完美的照片也是很简单的,下面就带来Android手机拍摄实用小技巧,一起来看看吧。
了解摄像头设置
在开始拍摄之前,先要熟悉手机和摄像头的设置,之后再拍摄就会得心应手了。如果我们能够了解不同的模式和设置,就可以深入探索和实验,让拍摄更具创造力。
确保镜头干净
看起来这一点很奇怪,在使用单反相机时,我们可能会记得擦拭单反镜头,但是很难记得要擦拭手机镜头。Android手机摄像头没有防尘防刮保护罩,专业相机有。
随身携带一小块清洁布,或者在钱包、夹克内缝一小块超细纤维镜头清洁布,时时提醒自己擦拭手机镜头和屏幕,如此一来就可以确保手机拍摄出最清晰的照片。如果嫌麻烦,可以直接用汗衫擦拭。不要忘了擦拭前置摄像头。
忘了闪光灯 用外部光源
如果外部环境黑暗,我们会下意识打开闪光灯拍摄照片,但是获得的图片质量总是不尽人意。事实上,我们完全可以不使用闪光灯,几乎从不使用。在拍摄照片时,我们可以寻找自然光源。如果你在餐馆内,想拍摄一张菜肴的照片,可以选择靠窗户的座位,如此一来就可以获得完美的光线,拍出菜肴的细节。
如果你想自拍,可以站在大窗户前拍摄。这样拍摄并不会让你的脸和特征“亮”起来,但是会让背景变暗,让你本人处在注意力的正中央。如果没有自然光,要拍摄照片是不可能的,因此在拍摄时最好找一个外部光源,比如一盏灯或者一支蜡烛。虽然看起来很愚蠢,但是几乎所有的其它光线都要比闪光灯好,有了更好的光线,就可以控制拍摄的内容,让我们想要的`部分亮起来。
不要变焦
和Android手机的闪光灯一样,我们应该避开变焦功能。变焦会降低图像的质量,当我们编辑照片时可能会发现一些惊艳的东西,之前没有发现,我们可以将这些漂亮的部分剪出来。
这一点我们很难记住,Android设备和单反相机是不一样的。用手机拍摄时如果我们使用了变焦功能,图像的质量很难保持一致。
如果你真的想亲近自己拍摄的对象,请站起来,走近它,不要使用变焦功能。用这种方法拍摄,可以很好控制拍摄的对象,如果用变焦功能就会降低照片的整体质量。
爆发性拍摄然后挑选
在拍摄照片时,爆发性拍摄的确是一种懒惰的拍摄方式,但是它极可能是拍摄完美照片的最有效方式。
不管是自拍、拍风景、或者是拍摄菜肴,使用爆发性拍摄方式可以毫无压力拍出一大堆照片,我们只需要按下快门,就可以用快速镜头拍出很多照片,拍完之后再选择哪些最完美的。
虽然拍摄的照片有许多很糟糕,完全无法使用,但是当中还是有隐藏了少数“宝石”。花点时间细细查看拍摄的照片,挑出最好的,删除糟糕的。
找一个自己喜欢的照片编辑软件
拍完照片之后,你可以选择自己喜欢的APP编辑软件编辑照片。现在市场上有许多的软件可供选择,每一款软件都有自己独特的功能,比如过滤器、调整亮度和对比度、甚至还可以增加文本信息和贴纸。
如果你对自己拍摄的照片信心不足,照片编辑软件也是一个很棒的补充工具。如果你对某些照片的质量有点担心,用编辑软件稍稍编辑可以“拯救”这些照片。
在社交媒体上关注你喜欢的摄影师
有时,用Android手机拍摄最好的照片并不是从相机APP开始的,而是从浏览社交媒体开始的,我们在社交媒体上看到摄影师用Android手机拍摄漂亮的照片,从中可以学到经验。
在社区媒体上关注一些摄影师,向他们取经,可以获得一些很好的经验,因此我们完全可以先看看别人拍摄的好照片,然后走出去尝试一下。你可以发表评论,问问他,看他是如何用特定风格拍摄特定对象的,或者问问他们是如何编辑特定照片、使之呈现特定风格的,拍摄者可能会回复。
你可以前往Instagram页面探索一下,欣赏欣赏其它Android手机摄影师拍摄的照片。最开始时你可以挑选喜欢的风格模仿拍摄,最终将它变成自己的。
1. wifi热点。只要你的手机有信号,你就可以用你的手机建一个wifi热点,这样你就可以通过你的笔记本和平板上网了。不过你也要小心,因为一些运营商会因此而多向你收钱。 2. 脸部安全锁。脸部安全锁并非传统意义上的密码锁,只要对着你的手机微笑,你的手机就会解锁。在选项卡中设置一下,你的手机会变得更加安全。 3. 自动操作。安卓上的第三方应用程序像Tasker和Automagic会自动执行任务。例如我可以设置这些程序,在我走进办公室的时候,关掉我的铃声。 4. Android Beam。Android Beam是一种交换联系信息,分享照片,甚至是无线分享应用程序的一种方法,通过Android Beam,两台安卓机链接到一起,然后他们就可以自动分享功能了。(你需要有一个装有Near Field Communication的最新安卓机型,最新机型像三星Galaxy系列和HTC One就装有ear Field Communication) 5. 键盘。一个关于安卓机最有趣的事情就是你可以选择额外的键盘。你可以下载一些第三方应用程序(Swype, Swiftkey),或者是从谷歌商店下载谷歌键盘的应用程序。 6. 截屏。这个功能很早之前就有,但是现在还没有被广而告之。以下是具体做法:同时按住电源键和音量调低键来截屏。小贴士:如果你正在路上,手机电量又很低,可以给你的目的地方向截一张图,这样就可以避免地图应用程序消耗你的电量了。 7. 数据流量控制。“无线网络”使我们每个月的数据使用量越发紧缩;安卓允许你设置控制并且还允许你管理网络数据。在设置应用程序中,点击“数据使用”你就会看到一张图表,这张图表显示了你数据的总使用量,以及你的数据流量是否接近警戒线。 8. 自动更新应用程序。应用程序会因更新变得更完善,但是我们大多数人没有时间更新程序。但是你可以设置他们自动更新。只要设置它们就好了。 9. 从其他设备进入平板。在你的电脑和手机中都装谷歌Chrome浏览器,他们能相互共享数据。在你的电脑浏览器中打开8个标签,然后再在手机上继续浏览-打开浏览器,瞧,这八个标签就是你刚才打开的那8个。 10. 插件。安卓最有用的功能就是能自定义主屏幕上的插件了。但是你知道还有更近的路可走吗?只要点一下主页上的插件,你就可以访问练习人,拨打电话,甚至是直连一台家里的平板。
1.使用Android 电源管理 widget 从Android 2.1系统开始内置了一个非 常强 大的带 能源管理 widget,通过这个widget你可以快速开启或者关闭Wi-Fi, 蓝牙 ,GPS,同步这些手机耗 电大 户,还可以方便的设定 手机屏幕 亮度,长按手机屏幕,就可以在widgets目录选择启用。 2.Android手机拨号屏幕 如果你对手机拨号屏幕 功能性 有特殊要求,Android绝对会满足你,点击联系人列表里任意一个用户,按手机menu 选项,里面有关 于单 个联系人的详细设置。 3.为每个联系人定制铃声 可以为女朋友或者家人设置单独的铃声,这样听到铃声就知道谁来电话了。设置方法点击联系人列表里任意一个用户,然后就可以设置铃声。 4.不要把手机 闹钟 (alarm clock)加入进程查杀列表里 这是一个经典的错误,很多用户都喜欢用 进程管理 程序自动杀掉一 些程序 以节省 电量 或者腾出 手机内存 ,不过如果不小心alarm clock进程也杀掉了,后果就是第二天早晨10:30才醒过来惊慌失措的奔向公司。 5.用文件夹组织内容 虽然 乔布斯 花了很久才决定放开iOS用户通过文件夹组织内容的权限,事实上Android从面世开始就支持这个功能,Android文件夹不但支持放入程序图标,还可以存放 通讯录 ,甚至facebook联系人等信息,长按手机屏幕就可以在桌面建 立文 件夹。 6. 重命名 文件夹 建立了文件夹后你可能需要修改它的名称,只需要打 开文 件夹,长按顶部的名称就可以调出重命名文件夹的窗口。 7.查看 系统日期 Android新用户可能觉得查看系统日期有点麻烦,其实只要按住屏幕顶部左上方的提醒栏,就会显示今天的日期,赶快试试吧。 8.挂载你的SD卡 Android系统基于Linux内核,所以使用外部 磁盘 之前必须要mount挂载后才可以正常使用。使用USB线连接手机和 电脑 时,手机会提示挂载SD卡,必须点击完成挂载后才可以在SD卡里拷贝或者删 除数 据。 9.设置 键盘 快捷方式 很多用户迷 恋物 理 全键盘 的另外一个重要原因就是Android支持大量的 键盘快捷键 ,通过快捷键可以快速调用相关程序,可以在系统设置应用程序快速启动里设置。 10.下载更多Android 动态壁纸 Android 2.1开始系统支持的另外一个功能就是动态壁纸,虽然动态壁纸可能会让你的手机耗电量增加,不过却能让你的手机看起来更酷,如果你喜欢耍酷,在Android Market搜索live wallpaper,会有很多动态壁纸等待你选择。 11.快速切换 主屏 Android系统一般提供5个主屏,或许你觉得每次滑动手指切换太麻烦,可以按一下 home键 ,然后就可以选择进入特定的主屏,HTC Sense的手机还支持 多点触摸 调出所有主屏幕供选择。 12.添加一个快速导航键 Android 2.1系统支持用户建立地图导航的快捷方式,选择任意一个导航线路都可以在桌面建立一个快捷菜单,可以在出 行前 设定好导航的线路,需要时点击快捷菜单节省时间。 13.设置双击屏幕放大的级别 绝大多数不支持多点触摸的Android手机,在使用 浏览器 浏览网页时都可以通过双击屏幕放大网页内容,而且你还可以在浏览器设置里“默认缩放”选项选择三种放大级别,这样每次使用双击放大时的效果都不同。 14.改变Android浏览器字体 Android 手机终端 千差万别,不同屏幕和分辨率的手机最佳的浏览字体都不同,只需要在浏览器设置里设置合适的 字体大小 ,就可以提高 阅读效率 。 15.搜索网页特定内容 在浏览器设置更多查找 选项可以用来搜索网页内容里的特定字段,帮助你快速查找相关内容,这也是PC浏览器的标准功能之一。 16. 语音输入 Android 2.1系统开始支持语音输入功能,虽然处理起来有些延时,如果你勤加练习还是可以做到基本正确输入,这 对练 习 英语口语 的同学也是一条途径。 17.Android 字典 造词功能 在使用Android键盘输入一个特定词语时,你可以长按它然后选择添加到建议词语区域,这样就可以把这个词加入Android字典,下次输入时只需打入前几个字目就可以调出这个词。 18.同步手机照片到Picasa相册 虽然Google的Picasa 网络相册 不及Flickr受欢迎。不过Android 2.1的3D相册开始支持自动同步手机照片到Picasa帐户,不需要 第三方软件 就可以设置同步给了很多用户使用Picasa的理由,不过悲剧的是Picasa在国内无 法正 常打开,原因大家都懂的。 19.下 载网 页图片 浏览网页时想保存图片,只要长按图片就可以单独保存,保存的图片可以在相册程序中查看。 20.管理Android通话记录 Android通话记录非常方便,长按任意一 条播 出或者接入 电话记录 就可以选择删除,非常easy。 21.使用Facebook头像作为通讯录联系人照片 如果你的Android手机安装了Facebook官方程序,可以设置自动从Facebook下载头像作为联系人照片。你还可以通过文件夹功能在手机桌面建立一个Facebook通讯录文件夹,区分你的现实世界好友和网络好友。 22.浏览器多 功能按钮 Android 2.1浏览器地址栏有一个多功能的按钮,当网页正在载入时,他显示为 “X”用来取消载入,一旦页面载入完成后它会变成书签添加和历 史记 录 管理工具 ,使用起来非常方便。 23.Android网页浏览历史记录快捷键 打开浏览器长按手机返回键就会调出网页浏览历史记录窗口,比使用菜单调用要方便非常多,浏览器重度使用者必备。 24.使用浏览器“ 标签 页”功能 PC上的浏览器“标签页”已经算是基本功能,Android 手机浏览器 其实也支持标签页浏览器,只是使用起来稍显复杂:浏览网页时长按一个url就可以选择在新窗口打开,然后使用Menu键,再选择窗口选项查看任意标签页。 25.Android设置过个Gmail帐户 从Android 2.1系统开始支持多帐户设置,打开Gmail程序,通过Menu 帐户添加帐户 就可以增加一个或者多个gmail帐户,不过目前Android多账户融合做的还不够完美,使用起来会有一些问题。 26.关闭Google建议搜索提速手机 如果你的Android手机是配置不高的入 门机 型,关闭Google网页搜索建议会大幅提升Google搜索的性能。Google根据你输入的内容提供搜索建议虽然很方便,不过却可能会导致性能不高的手机陷入 假死状态 。在系统设置 搜索 Google搜索设置里可以禁用搜索建议。 27.在手机主屏添加“热线电话”快捷键 虽然你的 手机通讯录 有成百上千个联系人,但是可能80%以上的通话对象只是其中的几个人。如果把这几个“热线电话”在桌面建立快捷方式,点击一下就可以拨号一定可以节省时间。长按手机屏幕空白,选择添加快捷方式,然后选择直接拨打的联系人就可以在Android手机桌面建立“热线电话”的一键拨号快捷键。 28.建立 常用网站 快捷方式 上面的一条秘籍其实也适合浏览网页。普通情况下即使你把经常访问的网站加入书签,你也需要先打开浏览器,然后在书签管理界面再选中你要访问的那一个。你也可以在书签管理里长按你一条书签然后选择“添加快捷方式”,这样会在手机主屏建立这个网站的快捷方式图标,点击后会自动调用浏览器程序打开网站访问,和一键拨号一样方便。HTC Sense用户也可以使用HTC书签Widget来实现这个功能。 29.建立 音乐播放 列表快捷方式 又是一条快捷方式的秘籍,同样也可以节省一些时间。在Android 音乐播放器 界面长按自己创建的音乐播放列表在桌面建立快捷方式,接下来就可以一键播放你最爱的“ 音乐排行榜 ”啦。 30.跳过Android滑动解锁屏幕 Android手机用户一般都采用滑动解锁屏幕的方式来唤醒手机,不过你可能不知道按两下手机的Menu键也有同样的效果,前提是你的手机制造商没有移除这个功能,很多装载HTC Sense手机可能无法使用这个特性。 31.快速删除图片 在 手机相册 程序里删除图片每次都会跳出确认框,这时候按一下Menu键可以不需确认删除 所有图片 ,绝对节约时间。 32.快速输入 特殊符号 这是一个一般人都不太注意的技巧,不过如果你是一个重度手机文字输入用户这个功能将非常有用。在使用Android官方 屏幕键盘 输入时,长按任意一个 字符 可以调出这个字符对应的特殊符号,比如长按S可以输入@,长按D可以输入#,这个技巧将大幅度改善你的手机输入速度。 33.更多Android表情 上面一条技巧也适用于Android 表情符号 输入,长按一种Android微笑表情会调出其他系统的微笑表情符号。 34.别人发给我的表情符号是什么意思 如果你已经老到搞不清楚不同的笑脸表情代表什么,你可以在输入界面按Menu键,选择插入表情符号,然后就可以看到所有Android表情符号以及对应的意思解释。 35.调整Android 拼写检查 如果你在使用Android键盘时发现拼写检查功能使用起来不方便,可以在设置 语言和键盘 Android键盘里关闭。 36.安装一个Android 文件管理 器 文件管理是Android系统目前最大的一个功能缺失之一,虽然你可以使用Android 系统工具 完成删除图片或者音乐等操作,但是从Android Market下载一个 文件管理软件 将让你在Android手机管理文件和PC上一样高效,目前Android系统最好的文件管理软件是Astro,推荐下载安装。 37.管理你的Android电池使用 你可能会突然发现自己的Android手机耗电量急剧上升却又搞不清楚究竟是哪里出了问题。Android系统其实已经手机了电池使用的详细统计。在手机设置菜单 关于手机 电池使用选项可以查看不同Android功能模块使用电池电量的比例,这样你就可以搞清楚哪个程序出了问题,再决定是否要删除。 38.从Android键盘设置键盘 Android的原生 键盘输入法 还提供一个快捷功能,长按123键可以调出Android 输入法 的设置选项。 39.快速结束输入 在 输入过程 中双击空格键,将会自动停止输入甚至加上一个 句号 。 40.清除手机输入历史 当你想完全清楚手机数据的时候往往会忽略这么一条。别忘了手机设置 语言和键盘 用户字典里清楚所有的输入历史。 41.让手机说一口纯真 英国 腔 你可能发现在使用Google Maps导航的时候 英语发音 非常奇怪,可以在Menu 设置 文字转语音 里勾选“时钟使用我的设置”选项,接下来你会发现导航发 音变 成了一口纯真英国腔,听起来舒服多了。 42.删除那些臃肿的程序 使用不支持APP2SD功能的Android手机的程序狂人们可能经常面临手机内存不足的窘境,需要删除部分应用程序解 放空 间。在设置 应用程序 管理应用程序 界面可以按Menu键按照程序大小排序,优先删除那些占用大量空间的程序。 43.激活 扬声器 有时候会碰到接听电话时环境太吵杂听不清楚的情况,在通话界面按Menu键然后选择“扬声器”选项,保证不但你能听清,周围人也能听清电话那头在说什么。 44.删除和某人的整条短信对话 如果 手机短信 里隐藏了不可高人的秘密,回家又不想被老婆发现。长按这条短信对话列表,然后选择删除,所有和对方发的短信都会被删除。 45.使用自己的图片做 壁纸 拍了一张很棒的 风景 照,或者想把家人的照片用来作为壁纸,只要长按手机屏幕,选择壁纸,然后选择你想用来做壁纸的图片就可以完成操作,设置壁纸前你甚至可以剪切其中的一块来作为最终的壁纸图片。 46.Android系统最新运行的 程序列表 长按Home键会调出Android系统最近运行的程序列表,如果你刚不小心关闭了一个程序,可以用这个办法再次打开使用。 47.关闭 手机动画 Android系统各种动画效果虽然可以让你的手机看起来很酷,不过也会消耗很多电池电量,也会影响手机性能。平时可以在设置 声音和现实 动画里关闭相关选项,大不了为其他用户做演示的时候再打开照样可以让别人感到惊艳。 48.Android 系统集成 进程管理 Android系统其实也有进程查杀的功能,只不过隐藏的非常深。在手机 设置 应用程序 里可以查看正在运行的服务,点击相关进程就可以强行关闭。不过这个功能比起第三方进程管理工具还是不够人性化。 49.设置手机解锁图案 为Android手机设置解锁图案可以增加一点手机的安全性,起码可以防止手机被 居心 不良的人 偷窥 ,只不过千万不要自己忘记了这个解锁图案,不然后果会很严重。 50.设置手机屏幕充电时不会休眠 如果不是因为耗电的原因让手机屏幕一直不休眠也是一件不错的事情,特别是当你的手机整夜充电的时候可以借助软件让你的手机变身一部电 子时 钟,既方便随时查看时间还可以充当 小夜灯 。在系统设置 应用程序 开发里勾选“保持唤醒状态”选项开启这个功能。
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 (ArrayIndexOutOfBoundsException 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 copy 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);
加一行判断就行了。
先想到这么多,以后再补充。