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 <> '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 。

注意这里的数字是16进制哦。

还有一种方法是:这个应该是XML经常使用的方法(new 2013.03.28)

'

<

>

别忘了数字后面的分号哦,而且其中的数字是十进制的

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的错误。

8. 控件有时不能充满整个屏幕:

        LinearLayout panel = new LinearLayout(this);
LinearLayout.LayoutParams llp = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.FILL_PARENT,
LinearLayout.LayoutParams.FILL_PARENT);
panel.setLayoutParams(llp);
root.addView(panel);

而应该是:

        LinearLayout panel = new LinearLayout(this);
LinearLayout.LayoutParams llp = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.FILL_PARENT,
LinearLayout.LayoutParams.FILL_PARENT);
root.addView(panel. llp);

9.按照以下的方式启动service,但是service没有起来

     Intent service = new Intent(this, FuncService.class);
startService(service);

很有可能是忘了在AndroidManifest.xml中注册FuncService

<service android:name="com.android.example.FuncService"/>

10.TextView中为什么会在有些行尾出现"..."字符,当然不是所有手机都是有问题,本来笔者刚开始也以为可能是

手机的ROM问题,认真review了代码,发现如下的代码:

        mIntroView = (TextView) findViewById(R.id.description);
mIntroView.setEllipsize(TruncateAt.END);

问题是上面的第2行,之前是因为要限定文本的行数,后来去掉限制,没有去掉以上的代码。

该行代码会导致很多的ROM上:只要一个文本行的文字在一个手机屏幕行显示不下的话,就自动在

行尾截断并在行尾添加"...",而之前没有问题是因为:全部显示的时候,我调用了如下方法:

mIntro.setMaxLines(Integer.MAX_VALUE);

Android编程容易犯的错误之一的更多相关文章

  1. Android编程容易犯的错误之二

    11.不要太相信工具,比如Eclipse里面的断点遇到多线程什么,经常不起作用/走不到,还有就是如果语句为空的也不会走,这时候别太早下结论断点地方出错了, 所以每个工程都应该有日志的开关,通过查看日志 ...

  2. C语言编程时常犯十八个错误

    C语言的最大特点是:功能强.使用方便灵活.C编译的程序对语法检查并不象其它高级语言那么严格,这就给编程人员留下“灵活的余地”,但还是由于这个灵活给程序的调试带来了许多不便,尤其对初学C语言的人来说,经 ...

  3. C#新手常犯的错误

    虽然这篇post的标题是新手常犯的错误,实际上很多有经验的程序员也经常犯这些错误,我整理了一下,就当是笔记.1.遍历List的错误,比如如下代码: List<String> strList ...

  4. C#中几个经常犯的错误总汇

    在我们平常编程中,时间久了有时候会形成一种习惯性的思维方式,形成固有的编程风格,但是有些地方是需要斟酌的,即使是一个很小的错误也可能会导致昂贵的代价,要学会善于总结,从错误中汲取教训,尽量不再犯同样错 ...

  5. Android编程中的实用快捷键

    作为一个优秀的程序员,不但要能开发出漂亮的软件,也要能熟练掌握编程的技巧,包括IDE的快捷键使用.比如linux 下的VI编辑器,对于不熟练快捷键的人来说就是一个噩梦,但一旦你熟练了VI的快捷键,VI ...

  6. Android编程中的5种数据存储方式

    Android编程中的5种数据存储方式 作者:牛奶.不加糖 字体:[增加 减小] 类型:转载 时间:2015-12-03我要评论 这篇文章主要介绍了Android编程中的5种数据存储方式,结合实例形式 ...

  7. R语言编程中的常见错误

    R语言编程中的常见错误有一些错误是R的初学者和经验丰富的R程序员都可能常犯的.如果程序出错了,请检查以下几方面. 使用了错误的大小写.help().Help()和HELP()是三个不同的函数(只有第 ...

  8. javascript中易犯的错误有哪些

    javascript中易犯的错误有哪些 一.总结 一句话总结: 比如循环中函数的使用 函数中this的指向谁(函数中this的使用) 变量的作用域 1.this.timer = setTimeout( ...

  9. 读《Android编程权威指南》

    因为去年双十二购买了一折的<Android 编程权威指南(第一版)>,在第二版出来后图灵社区给我推送了第二版的优惠码,激动之余就立马下单购买电子书,不得不说Big Nerd Ranch G ...

随机推荐

  1. Caliburn.Micro学习笔记(三)----事件聚合IEventAggregator和 Ihandle<T>

    Caliburn.Micro学习笔记目录 今天 说一下Caliburn.Micro的IEventAggregator和IHandle<T>分成两篇去讲这一篇写一个简单的例子 看一它的的实现 ...

  2. RTC时钟

    1.设置时间之前取消备份区域(BKP)写保护 主要有两部分组成 1.用来和APB1总线对接,对其进行读写操作 2. 预分频模块:在RTC_CR设置相应的允许,位每个TR_CLK周期中RTC产生一个中断 ...

  3. SharePoint中使用C#跳转页面的研究

    最近开发SharePoint的时候遇到问题,不能完成跳转,于是归纳了一下方法(最后还是使用了js跳转,后台跳转被sharepoint限制了). 1.最常用的页面跳转(原窗口被替代):Response. ...

  4. Matlab2015入门学习02

    1. 续行符 ... 当物理的一行之内写不下时, 在 物理行的结尾加上三个小黑点 >>跟在运算符之后,可以不留space空格 >>跟在数字之后,若不留白space,出错; 留一 ...

  5. Redis集群(三):主从配置一

    一.本文目的          Redis的主从配置分为两篇文章,第一篇主要介绍了Redis主从配置的搭建过程及使用,第二篇主要说明各种情况下Redis主从状态,如Master挂掉,Slaver挂掉, ...

  6. [fiddler] 手机抓包

    最近工作涉及到与原生app联调,需要抓取手机上的请求.借此机会研究了下fiddler,简直神器. 以下简单介绍通过fiddler进行手机抓包的方法,之后也会陆续更新fiddler的其他功能 设置fid ...

  7. layer弹窗监控键盘事件

    在开发中我们常常遇到客服各种其他问题,现在客服需要键盘按下关闭当前窗口事件和鼠标点击确定按钮事件一样. 我们需要在layer中编写一个监控事件.具体代码如下 layer.confirm('is not ...

  8. 【bzoj1059】 ZJOI2007—矩阵游戏

    http://www.lydsy.com/JudgeOnline/problem.php?id=1059 (题目链接) 题意 一个01矩阵,可以任意交换两行或两列,问能否经过若干次交换后使主对角线全为 ...

  9. 了解了下 Google 最新的 Fuchsia OS

    就是看到篇报道,有点好奇,就去FQ挖了点东西回来. 我似乎已开始就抓到了重点,没错,就是 LK . LK 是 Travis Geiselbrecht 写的一个针对 ARM 的嵌入式操作系统,开源的.点 ...

  10. B:Wordpress不同分类调用不同的模板

    这里指的是默认文章类型的模板(single.php,category.php) 应用场景: 默认文章默认有2个大类(新闻资讯.游戏资料) 新闻资讯下的所有子分类调用"新闻资讯列表模板,新闻内 ...