1.设置TextView的文本颜色
TextView tv;
...
tv.setTextColor(R.color.white);
其实这样设置的颜色是 R.color.white的资源ID值所代表的颜色值,而不是资源color下的white颜色值:正确的做法如下:
tv.setTextColor(getResources().getColor(R.color.white));
这个出错的概率满高的,就是因为二者都是int类,导致编译器不报错。
2.读取Cursor中的值
Uri uri;
Cursor cursor = contentResolver.query(uri, null,null,null,null);
if(cursor !=null){
String name = cursor.getString(1);//
curosr.close();
cursor =null;
}
上面语句中的,执行到cursor.getString(1)部分就会报异常,异常是: Caused by: android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 4
编译没有问题,只有在运行的时候才会发现。
正确的做法是:
Uri uri;
Cursor cursor = contentResolver.query(uri, null,null,null,null);
if(cursor !=null){
if(cursor.moveToFirst()){
String name = cursor.getString(1);//
}
curosr.close();
cursor =null;
}
或者:
Uri uri;
Cursor cursor = contentResolver.query(uri, null,null,null,null);
if(cursor !=null){
while(cursor.moveToNext()){
String name = cursor.getString(1);//
}
curosr.close();
cursor =null;
}
3.不要使用标有Deprecated的函数或者类,比如不要使用android.telephony.gsm.SmsMessage,而应该用android.telephony.SmsMessage,这样避免采用不同的3G协议时不会出现问题。
4.SQLite中的查询条件,比如一个叫name的字段,其字段类型为TEXT,如果我们要判断其name不等某个值(如zhangsan),写出如下的语句:
但是,这样写的语句,如果碰到name值为空的时候,就有问题,即name为空时 以上的布尔值为false,而不是true.
原因很可能,SQLite中的判断函数采用类似写法:
boolean judge(String self, String conditions){
if(null == self) return false;
return self.equalsIgnoreCase(conditions);
}
其中 self为数据库中name的值,而conditions为上面示例中的 zhangsan。
所以,以上查询条件的正确写法是:
name <> 'zhangsan' or name is null
除非你也想过滤掉name 为空的记录。
5.如下所示,想要在按钮显示"删 除"(没错删除中间有个空格),以下的字符串资源是错误的:
<string name="button_delete_text">删 除</string>
这样的出来,最终看不到中间的空格,应该是Android SDK编译的时候,会自动过滤掉String中的空格部分,所以应该采用以下的方式:
<string name="button_delete_text">删\u0020除</string>
类似地,其他的特殊符号都可以用\u00XX来转义,如 ' ---- \u0027, < ----- \u003C, > ---- \u003E 。
6. context的问题:
如果在一个非Activity的context里面调用startActivity,那么其intent必须设置:
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
否则,会报如下类似的错误:
Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag.
而我们还要提防系统控件中的隐性调用startActivity:
TextView tv = new TextView(mContext);
tv.setAutoLinkMask(Linkify.ALL);
tv.setText(content);
当content内容中有电话号码/邮件/URL时,并且mContext不是非Acitvity的context,而是app的context时(XXXActivity.this.getApplicationContext()),
就会出现如下的错误:
android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity
context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
E/AndroidRuntime(10382): at android.app.ContextImpl.startActivity(ContextImpl.java:622)
E/AndroidRuntime(10382): at android.content.ContextWrapper.startActivity(ContextWrapper.java:258)
E/AndroidRuntime(10382): at android.text.style.URLSpan.onClick(URLSpan.java:62)
由于URLSpan.onClick中调用startActivity是由系统控制的,所以我们必须传入activity的contex,才不会出现如上的异常,导致程序退出。
7. 另外一个context的问题:如果你在一个单实例的对象中,有个注册监听器的行为的话,那么传给这个单实例
对象的context,就必须是ApplicationContext了,否则会出现:receiver leak的错误。