Android编程容易犯的错误之二
11.不要太相信工具,比如Eclipse里面的断点遇到多线程什么,经常不起作用/走不到,还有就是如果语句为空的也不会走,这时候别太早下结论断点地方出错了,
所以每个工程都应该有日志的开关,通过查看日志来确认,某个路径是否走到或者某个变量的值,。。。
12.Java中的月份是从0开始的,所以格式化月份的时候,记得在原有的值上加1处理,如:
Calendar calendar = Calendar.getInstance(); if(!TextUtils.isEmpty(dateTimes)){ long milliseconds = WLDateUtils.parseDayTime(dateTimes); calendar.setTimeInMillis(milliseconds); } final int old_year = calendar.get(Calendar.YEAR); final int old_month = calendar.get(Calendar.MONTH); final int old_day = calendar.get(Calendar.DAY_OF_MONTH); mDatePickerDialog = new DatePickerDialog(this, new OnDateSetListener(){ @Override public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { if(year != old_year || monthOfYear != old_month || dayOfMonth != old_day){ String dateTimes = String.format("%04d-%02d-%02d", year, monthOfYear + 1, dayOfMonth);//月份是从0开始的 } } }, old_year, old_month, old_day);
13.设置ListView的分割线,如果不是图片的话,应注意顺序:
mListView = new ListView(this); mListView.setCacheColorHint(0); mListView.setBackgroundDrawable(null); mListView.setDivider(getResources().getDrawable(R.drawable.list_divider)); mListView.setDividerHeight(2); 其中: <drawable name="list_divider">#00CCCC00</drawable>
即 setDividerHeight 函数应该在setDivider之后,否则这个分割线无效。
14.拼写错误
1)
<uses-permission android:name="android.permission.BLUETOOTH" />
而不是
<user-permission android:name="android.permission.BLUETOOTH" />
而且就算这样写错了,也能编译通过,只不过安装的时候不会显示该APP需要的权限,当然该APP什么权限都没有申请到。
15.当遇到如下的错误的时候(但是直接在PC的浏览器输入地址是没有问题的),第一个感觉是去验证下设备(比如手机是否能联网) ,而不是去找服务器端开发人员,质疑网络配置是不是有问题:
10-15 17:03:36.043: E/XXXApp(5660): Connection I/O Exception :java.net.UnknownHostException: Unable to resolve host "www.baidu.com": No address associated with hostname
16.TextView千万不要被放大,也不要作为将要被放大的父视图中,否则TextView上的文字四周会出现像毛笔字旁边的方框,尤其是大屏幕的设备(比如:电视)很容易看到。
17.selector(XML资源定义)中千万不要将@null给drawable否则,XML inflate时,会报
android.view.InflateException: Binary XML file ...
的错误。解决方法是:采用透明图代替这个@null
18. 对于像ListView、GridView的上下边距,如果怎么设置都达不到效果的时候,可以看看这个clipToPadding的这个属性,其值默认为false的,保证你看完有相见恨晚的感觉。
19.Java的标准代码,也有违反常理的例子,比如Calendar.getInstance(),看这名字,以为是单实例,可看了源代码,就会发现,其实就是一个静态的函数,用于创建Calendar对象
public static synchronized Calendar getInstance() { return new GregorianCalendar(); } public GregorianCalendar() { this(TimeZone.getDefault(), Locale.getDefault()); } public GregorianCalendar(TimeZone timezone, Locale locale) { super(timezone, locale); setTimeInMillis(System.currentTimeMillis()); }
20.对于有时偶尔遇到的问题,应该考虑下是否是多线程引起的问题,多打LOG,对于可能引起问题的地方,加个同步所看看。
21.使用ViewStub时遇到如下的FC log
E/AndroidRuntime(4441): java.lang.IllegalStateException: ViewStub must have a non-null ViewGroup viewParent E/AndroidRuntime(4441): at android.view.ViewStub.inflate(ViewStub.java:287)
Java代码
mAttachViewStub.setVisibility(View.VISIBLE); View view = mAttachViewStub.inflate(); mScreenView = (ScreenView)view.findViewById( R.id.attachment_type_screen);
排查才知道,其实mAttachViewStub.setVisibility(View.VISIBLE)相当于mAttachViewStub.inflate(),所以以上的代码相当于重复inflate了ViewStub,导致FC。
以上选择其中一个即可,当然用直接调用的话比较好,查找效率高:
View view = mAttachViewStub.inflate();
mScreenView = (ScreenView)view.findViewById(R.id.attachment_type_screens);
而如下的方法,效率明显低些,尤其整个页面的View比较多的时候,因为需要在整个页面查找View:
mAttachViewStub.setVisibility(View.VISIBLE);
mScreenView = (ScreenView)findViewById(R.id.attachment_type_screens);
22. 千万不要将原本是JPG格式图片文件的扩展名标记为PNG,这样平常用Eclipse开发的时候没有报错,但是一旦用源码编译就会出现问题:
libpng error: Not a PNG file
ERROR: Failure processing PNG image packages/apps/Contact/res/drawable-xxhdpi/title.png
竟而导致以后一堆的:
packages/apps/Contact/res/layout/detail_box.xml:89: error: Error: No resource found that matches the given name (at 'background' with value '@drawable/add_pic_btn_bg').
当然也不要将PNG图片文件的扩展名标记为JPG。
23.注意id不要写重了,尤其是有用include layout 或者字节写的控件布局的,通过findViewById找到的是第一个匹配的id;
这个查起来就很麻烦。(20161229)