android开发常见编程错误总结

1.设置TextView的文本颜色


1

2

3

TextView tv;

...

tv.setTextColor(R.color.white);

其实这样设置的颜色是 R.color.white的资源ID值所代表的颜色值,而不是资源color下的white颜色值:正确的做法如下:


1

tv.setTextColor(getResources().getColor(R.color.white));

这个出错的概率满高的,就是因为二者都是int类,导致编译器不报错。

2.读取Cursor中的值


1

2

3

4

5

6

7

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

编译没有问题,只有在运行的时候才会发现。

正确的做法是:


1

2

3

4

5

6

7

8

9

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;

}

或者:


1

2

3

4

5

6

7

8

9

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),写出如下的语句


1

name <> ‘zhangsan‘

但是,这样写的语句,如果碰到name值为空的时候,就有问题,即name为空时 以上的布尔值为false,而不是true.

原因很可能,SQLite中的判断函数采用类似写法:


1

2

3

4

boolean judge(String self, String conditions){

    if(null == self) return false;

    return self.equalsIgnoreCase(conditions);

}

其中 self为数据库中name的值,而conditions为上面示例中的 zhangsan。

所以,以上查询条件的正确写法是:


1

name <> ‘zhangsan‘ or name is null

除非你也想过滤掉name 为空的记录。

5.如下所示,想要在按钮显示"删 除"(没错删除中间有个空格),以下的字符串资源是错误的:


1

<string name="button_delete_text">删 除</string>

这样的出来,最终看不到中间的空格,应该是Android SDK编译的时候,会自动过滤掉String中的空格部分,所以应该采用以下的方式:


1

<string name="button_delete_text">删\u0020除</string>

类似地,其他的特殊符号都可以用\u00XX来转义,如 ‘ ---- \u0027,  < ----- \u003C, > ---- \u003E 。

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

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

'

<

>

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

6. context的问题:

如果在一个非Activity的context里面调用startActivity,那么其intent必须设置:


1

intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

否则,会报如下类似的错误:


1

Calling startActivity() from outside of an Activity  context requires the FLAG_ACTIVITY_NEW_TASK flag.

而我们还要提防系统控件中的隐性调用startActivity:


1

2

3

TextView tv = new TextView(mContext);

tv.setAutoLinkMask(Linkify.ALL);

<br>tv.setText(content);

当content内容中有电话号码/邮件/URL时,并且mContext不是非Acitvity的context,而是app的context时(XXXActivity.this.getApplicationContext()),

就会出现如下的错误:


1

2

3

4

5

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. 控件有时不能充满整个屏幕:


1

2

3

4

5

6

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);

而应该是:


1

2

3

4

5

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没有起来


1

2

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

startService(service);

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


1

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

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

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


1

2

mIntroView = (TextView) findViewById(R.id.description);

mIntroView.setEllipsize(TruncateAt.END);

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

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

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


1

mIntro.setMaxLines(Integer.MAX_VALUE);

11.不要太相信工具,比如Eclipse里面的断点遇到多线程什么,经常不起作用/走不到,还有就是如果语句为空的也不会走,这时候别太早下结论断点地方出错了,

所以每个工程都应该有日志的开关,通过查看日志来确认,某个路径是否走到或者某个变量的值,。。。

12.Java中的月份是从0开始的,所以格式化月份的时候,记得在原有的值上加1处理,如


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

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的分割线,如果不是图片的话,应注意顺序:


1

2

3

4

5

6

7

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之后,否则这个分割线无效

android开发常见编程错误总结

时间: 2024-10-11 01:30:05

android开发常见编程错误总结的相关文章

Android开发 |常见的内存泄漏问题及解决办法

在Android开发中,内存泄漏是比较常见的问题,有过一些Android编程经历的童鞋应该都遇到过,但为什么会出现内存泄漏呢?内存泄漏又有什么影响呢? 在Android程序开发中,当一个对象已经不需要再使用了,本该被回收时,而另外一个正在使用的对象持有它的引用从而导致它不能被回收,这就导致本该被回收的对象不能被回收而停留在堆内存中,内存泄漏就产生了. 内存泄漏有什么影响呢?它是造成应用程序OOM的主要原因之一.由于Android系统为每个应用程序分配的内存有限,当一个应用中产生的内存泄漏比较多时

Android开发常见的Activity中内存泄漏及解决办法

上一篇文章楼主提到由Context引发的内存泄漏,在这一篇文章里,我们来谈谈Android开发中常见的Activity内存泄漏及解决办法.本文将会以"为什么""怎么解决"的方式来介绍这几种内存泄漏. 在开篇之前,先来了解一下什么是内存泄漏. 什么是内存泄漏? 内存泄漏是当程序不再使用到的内存时,释放内存失败而产生了无用的内存消耗.内存泄漏并不是指物理上的内存消失,这里的内存泄漏是值由程序分配的内存但是由于程序逻辑错误而导致程序失去了对该内存的控制,使得内存浪费. 怎

Android导入常见的错误

1.SDK版本不对应,你可以打开你项目中的project.properties文件,修改target=android-18(我这是18) ,将18改     为14(其他都可以),再改回18会重新加载. 2.V4包不对应,重新导入你当前环境的V4包 3.如引用了项目类型的Lib,右键项目——>properties——>android——>查看项目是否引入,查看是否勾选Is library 4.styles.xml文件错误,可能用到了高版本的样式,下载高版本或将样式改为低版本 5.由于编码

android开发数据库Cursor 错误android.database.CursorWindowAllocationException

做android 开发的经常会遇android.database.CursorWindowAllocationException这样子的错误;一般出现这样的错误,大部分原因是因为没有关闭cursor,或者是因为Cursor使用不当,之前我的遇到这样的代码: ForecastData situation = null; ................ Cursor cursor = mContext.getContentResolver().query(WEATHER_URI, null, nu

android 开发中遇到错误及解决办法总结

新手总结的开发中所遇到错误及解决办法,如有不对,欢迎指正,如有更好的解决办法,也请不吝赐教. 一.dialog.show()引起的android.view.WindowManager$BadTokenException错误 错误日志 android.view.WindowManager$BadTokenException: Unable to add window -- token [email protected] is not valid; is your activity running?

Android开发常见错误及技巧

1.无法使用网络:Permission denied(maybe missing internet permission) 在AndroidMainifest.xml中增加允许使用网络选项(在</application>结束标签之后>): <uses-permission Android:name="android.permission.INTERNET" /> 2.找不到activity类: android.content.ActivityNotFoun

Android开发常见错误

1.java.net.SocketTimeoutException: Transport endpoint is not connected 此问题可能是conn的地址填写错误最好填写ipv6的地址

Android开发之导入错误

在导入Git库中更新下来的工程的时候,自己手动的添加libs,assets等依赖库进去.但是导入工程总是会莫名奇妙的出现问题,特别是对Android系统库依赖的报错之类的. 解决方法: 1,clean一下工程:如果无效,转入2: 2,重启Eclipse,因为Ubuntu下面的Eclipse总是会抽筋,所以有时候这样就可以解决问题了:如果这样还是没有效果:转入3: 3,配置编译器.如下图所示. 这样,我所遇到的这种导入问题,算是都解决了.如果读者碰到了解决不了的,可以联系我,大家一起学习.

9种常见的Android开发错误及解决方案

整理总结了9个Android开发中的错误以及解决方案,共同探讨进步! 1. 如果你的项目的R文件不见的话,可以试下改版本号在保存,R文件不见一般都是布局文本出错导致. 2. 布局文件不可以有大写字母 3. 抛出如下错误WARNING: Application does not specify an API level requirement!, 是由于没有指定users sdk的缘故,修改AndroidManifest.xml文件. 加入:<uses-sdkandroid:minSdkVersi