那些年Android开发中遇到的坑
- 使用静态变量来缓存数据时,不管是在Application类还是其他类,都要注意因应用重建而引发的问题。
- 使用DecorView作为PopupWindow的anchorView时,在华为P7中它是显示在系统状态栏下方的(Android 5.1.1系统),在华为3C,三星S4,红米Note2(5.0.2)上表现正常。
- 裁剪图片并且以bitmap返回时,如果你调用的是系统的裁剪功能,当图片过大时在米3当中将会导致系统的裁剪图片应用引发
TransactionTooLargeException异常,并且不断重试,且需要重启手机才能恢复。大图的裁剪建议使用URL而不是直接返回数据。 - 不要使用
Build.FINGERPRINT的值是否为"unknown"或是否以其开头来判断是否为模拟器,因为魅蓝的这个字段就是unknown。 - bitmap如果是alpha图,rgb储存的是预乘了alpha的数值(来自QQ群242876551)
- 重度使用Fragment者,在Fragment中使用SurfaceView(包括3D地图)时需注意机型的兼容,有可能出现部分机型中从其他Activity回来时,surfaceview的绘制会覆盖到最上面(仅仅是画面覆盖到其他控件上面,但不影响其他控件),在米2,三星S4上出现过,偶发。
- 不要在Activity或Fragment没有完全显示时弹出PopupWindow,如果需要,使用其中的
view.post(runnable)方法来执行弹出的代码。 - 有虚拟导航栏的手机,使用
showAsDropDown弹出的高度为MATCH_PARENT的PopupWindow的底部会被虚拟导航栏所覆盖。 - 更改应用图标之后,小米的ROM的桌面图标是没有更新的,需要切换主题或重启。
调用
RadioGroup.check(int id)时,RadioGroup.OnCheckedChangeListener. onCheckedChanged(RadioGroup group, int checkedId);会被调用多次。源码如下:java
public void check(int id) {
// don’t even bother
if (id != -1 && (id == mCheckedId)) {
return;
}
if (mCheckedId != -1) {
setCheckedStateForView(mCheckedId, false);
}
if (id != -1) {
setCheckedStateForView(id, true);
}
setCheckedId(id);
}其中:
setCheckedStateForView(mCheckedId, false);会导致onCheckedChanged(RadioGroup group, int checkedId)被调用,传的id是上一次被选中的id,其获取到的选中状态为false。setCheckedStateForView(id, true);会导致onCheckedChanged(RadioGroup group, int checkedId)被调用,传的id是本次被选中的id,其获取到的选中状态为true。setCheckedId(id);会直接回调onCheckedChanged(RadioGroup group, int checkedId),与上一条一样,传的id是本次被选中的id,其获取到的选中状态为true。
使用满屏的对话框,显示之后,在华为P7(5.1.1)上锁屏再解锁,下面的内容会少掉大约系统状态栏的高度的内容。非必现,但概率极高。
- 竖屏拍照时设置相机旋转,在手里的三星S4上拍的照还是横着的,它只是写入旋转的Exif信息。
- 在酷派手机上,拍照时如果PreviewSize和PictureSize相差太大时,生成的图片的拍摄范围可能和预览的拍摄范围不一样(可能比预览的范围小)。
- 对一个Bitmap,调用Bitmap.create(xxx)方法创建一个新的bitmap,并设置到ImageView上,如果回收旧的bitmap,在手里的华为3C上,ImageView无法显示图片。
- 一些手机通过
getSupportFragmentManager().beginTransaction().replace()先后显示两个fragment之后,调用getSupportFragmentManager().getFragments()返回的ArrayList<Fragment>,可能size是两个,但是第一个却是为空的。
- 在定义的shape中,如果没有通过
solid或其他元素指定shape颜色,可能导致在部分手机上背景是黑的。包括一些View以及LinearLayout的divider。 - 如果是通过
RadioGroup及RadioButton来实现底部Tab,则可能在一些手机上文字及drawableTop是偏向右边的,即使把gravity属性设为水平居中。通过设置android:paddingLeft="0dp"或android:background="@color/transparent"可以解决。 AndroidManifest.xml里application节点的android:supportsRtl属性,可能会影响到popupwindow里TextView的布局。我遇过它使我的TextView的文字由居中变成了左对齐。- 华为EMUI3.1虽号称基于Android5.1,但是却不能通过调用setStatusBarColor()接口来设置系统状态栏颜色,只能通过4.4.2的方式,在StatusBar上添加一个与其同高的View来设置颜色。具体见https://github.com/msdx/status-bar-compat 。
- 魅族Flyme5.1.9对系统状态栏大改,虽然Android版本是6.0以下,但是可以使用6.0的方式来设置StatusBar颜色,但是,当有多个界面切换时,StatusBar的图标及文字的颜色可能无法控制(如当切换界面时,白色的图标或文字会变成黑色)。
- LinearLayout设置分割线,
showDividers="middle|end",当最后一个View设置为GONE时会导致最后一条分割线不显示出来。解决方法是设置showDividers="middle",然后在LinearLayout里面最后添加一个没有内容的View。具体参考:http://stackoverflow.com/questions/24187698/bottom-divider-is-missing-when-visibility-of-the-last-view-is-set-to-gone-in-lin#answer-24189135 。 - 数字前面加“+”号的字符串,如“+00”,转换为int类型,在Android 4.4.2中会报
java.lang.NumberFormatException: Invalid int: "+00",但在Android 5.1中可以正确被转换(Java7新特性)。
欢迎补充及指正。
那些年Android开发中遇到的坑的更多相关文章
- 记录Android开发中遇到的坑
1. 出现错误提示:Intel HAXM is required to run this AVD,VT-x is disabled in BIOS的解决办法. 点击SDK图标,安装Intel x86 ...
- Android开发需要注意的坑
Android开发需要注意的坑一览对于一些Android开发过程中坑爹.细小,但又重要的错误的总结Android开发在路上:少去踩坑,多走捷径其他参考: google官方版本发布图 umeng ...
- android开发过程中遇到的坑
在android的学习过程中,会有很多坑,我会把我遇到的,一一列下来,方便后来者查阅! 1:android-support-v4.jar and android-support-v7-appcompa ...
- Android学习探索之Java 8 在Android 开发中的应用
前言: Java 8推出已经将近2年多了,引入很多革命性变化,加入了函数式编程的特征,使基于行为的编程成为可能,同时减化了各种设计模式的实现方式,是Java有史以来最重要的更新.但是Android上, ...
- android开发中fragment获取context
在用到fragment时无法使用.this来指定当前context内容,android开发中fragment获取context,可以使用getActivity().getApplicationCont ...
- java中的反射机制在Android开发中的用处
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反 ...
- Android开发中的输入合法性检验
Why ? 合法性检查对于程序的健壮性具有重要作用.在Android开发中,良好的合法性检查设计机制可以使程序更加清晰,产生bug更少,交互更加友好. What ? 合法性检查的目的在于确定边界.对于 ...
- 在android开发中使用multdex的方法-IT蓝豹为你整理
Android系统在安装应用时,往往需要优化Dex,而由于处理工具DexOpt对id数目的限制,导致其处理的数目不能超过65536个,因此在Android开发中,需要使用到MultiDex来解决这个问 ...
- 怎样实现了捕获应用中的日志在android开发中
怎样实现了捕获应用中的日志在android开发中,大家可研究一下. Process mLogcatProc = null; BufferedReader reader = null; try { mL ...
随机推荐
- npm管理工具介绍
概述 Npm是NodeJS包管理工具,在最新版本中Nodejs集成了npm,可以通过输入 "npm -v" 来测试是否成功安装.如果你安装的是旧版本的 npm,可以通过 npm 命 ...
- FFmpeg的H.264解码器源代码简单分析:环路滤波(Loop Filter)部分
===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...
- JAXB(Java Architecture for XML Binding)
marshal(Java对象转化成XML) import javax.xml.bind.annotation.XmlRootElement; //指定根元素,其他属性默认为根元素的子元素 @XmlRo ...
- How to generate the complex data regularly to Ministry of Transport of P.R.C by DB Query Analyzer
How to generate the complex data regularly to Ministry of Transport of P.R.C by DB Query Analyzer 1 ...
- Android 访问assets下的文件
assets下经常可以放一些比较大的资源,对于这些资源我们如何访问. 步骤 1.获取AssetManager. AssetManager am = getResources().getAssets() ...
- jvm库对nio的处理
JVM的IO选择 查JVM源码时刚好看到JVM库的一段代码: public static SelectorProvider create() { String osname = AccessContr ...
- Fetch XML and ConditionExpression operators
https://msdynamicscrmblog.wordpress.com/2013/05/10/fetch-xml-and-conditionexpression-operators-using ...
- NoSQL数据库之Redis数据库:Redis的介绍与安装部署
NoSQL(NoSQL = Not Only SQL),它指的是非关系型的数据库.随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的w ...
- UNIX环境高级编程——无名管道和有名管道
一.进程间通信 每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2 ...
- ios swift模仿qq登陆界面,xml布局
给大家推荐两个学习的地址: 极客学院的视频:http://www.jikexueyuan.com/path/ios/ 一个博客:http://blog.csdn.net/lizhongfu2013/a ...