Android开发的一些需要注意的细节

备份用,转自:http://blog.csdn.net/jiwangkailai02/article/details/21079975

1. 使用ListView时如果用到removeHeaderView,一定要确定ListView已经使用了setAdapter方法,不然会报NullPointException。

2. 使用ListView的时候,布局尽量使用fill_parent或者写死,如果使用wrap_content,它初始化的时候需要测量,会重复调用adapter的getView方法。

3. 使用ListView时如果要隐藏HeaderView,不能通过把HeaderView设为GONE实现,要通过removeHeaderView来实现。

4. 使用ListView时尽量不使用onItemClick和onItemLongClick,而在adapter的getView中使用onClick和onLongClick。

5. Activity保存状态信息是应该在onPause时做,而不是onStop时做,以为可能因为内存紧张,可能不会调用onStop方法。

6. 在自定义一个UI控件的时候,一定要提供一个具有两个参数类型分别为Context和AttributeSet的构造函数,否则的话,该自定义控件就不可以在UI布局文件中使用。

7. 在定义Dialog,调用其dismiss和show方法的时候,一定要注意判断调用该Dialog的activity是不是已经为空或者已经finish了。

8. 虽然不是android的,但这个问题浪费了我快一天时间,下次一定要避免出现这种错误。


9. 单例中如果hold有context,一定要保证这个context是ApplicationContext,因为如果是Activity的context,会影响这个activity的回收。

10. 用SparseArray<E>代替HashMap能提高性能。

11. 当使用.9图做为一个view的background,如果在代码中动态修改了它的background,那么,这个view原先设置的padding将会失效。应先保存去padding值,然后等动态设置完background后再通过setPadding设置padding值。

12. 一个View,如果既设了padding,又设了paddingTop,那么只有padding生效,paddingTop是无效的。

13. 在开发下载功能的时候,使用Service和DB是用来在activity死掉后,管理和记录下载状态。

14. 可以把ListView的adapter设置为null,这样就只显示ListView的headView,4.0以下也是没有问题的。

15. 要注意这样的问题:ListView的adapter是通过一个list关联其item的,如果子线程会动态修改这个list(即子线程和adapter引用同一个对象,子线程会修改这个对象的值),在滑动ListView的时候就会有异常抛出。

16. 要十分注意数据库降版本的情况。

17. ListView如果布局高度不确定的时候,会计算其或其父控件的高度,所以会造成其getView方法被重复调用的情况。

18. If an activity is paused or stopped, the system can drop it from memory either by asking it to finish (calling its finish() method), or simply killing its process. 

19. 如果ListView没有HeaderView或者FooterView的时候,与ListView相关联的Adapter就是传进来的参数Adapter。如果有,则原来的Adapter将被包装成HeaderViewListAdapter,通过getWrappedAdapter()方法可以获取原来的Adapter。

20. 获取正在与用户交互的activity的方法为:

21.通过命令adb shell dumpsys activity  可以查看activity的task信息。

22.使用TypedArray之后,记得使用recycle方法来回收。

23.在activity中通过getWindow().setBackgroundDrawable(null);可以减少一个层级。(getWindow().setBackgroundDrawable()还有另外一个用法就是输入法弹下去时背景为黑色,可以通过这个来改为想要的颜色)。

24. 隐藏ListView的footerView可以通过设gone和设padding(0, -footerviewHeight, 0, 0)来搞定。

25. The three-argument version of LinearLayout constructor is only available with API 11 and higher。

26. 通过getWindow().setBackgroundDrawable(null);把window的背景设置为null,同时没有设置layout的背景,滑动的时候会导致花屏。

27. 在Adapter的getView()方法中,对convertView通过setLayoutParams(width, height)方法设置在父View中的width和height时,height为0,是没有作用的,设置为1就有作用。同时MATCH_PARENT为-1,WRAP_CONTENT为-2,也要注意使用。

28. ListView使用方法setSelection(position)不起作用是因为有其他地方在操作UI。

29. Android中animation自从开始起作用后,就缓存到了某个地方,只管不停的绘制,哪怕自己都不存在了,都还在那绘制,clearAnimation的作用就是通知一下他,你都没了,别再画了(比如一个button,startAnimation后没有clearAnimation,你点击的话很难相应,那就是因为这个button一直在不停的绘制,你点击的时候一直获取不到焦点)。

30. Android中animation对于目标view的位置实际上是没有改变的,当android:fillAfter="true"时,动画结束后view停在动画最后一祯的位置。

31. 如果TextView的text含有特殊字符,使得text不靠TextView的左边显示,可以通过强制设置gravity为left来解决。

32. ListView监听OnScrollListener获取的firstVisibleItem代表的是第一个完全显示的item的index,只显示一部分的不算是firstVisibleItem。

33. getChildAt(0) == getChildAt(firstVisibleItem - getHeaderViewsCount());

34. PopupWindow中的EditText点击和长按的时候是没有复制,黏贴,全选这些选项弹出来的,这是android的一个系统bug,可以使用Dialog替代PopupWindow来达到同样的效果。

35. 弹toast一定只能在UI线程中弹,不然会crash。

36. activity的finish方法中使用了synchronized (this),所以activity的方法尽量不要使用 synchronized来修饰,或者有 synchronized (this)修饰的方法块,因为这些方法或者方法块一旦存在耗时操作,会导致finish方法无法执行,从而造成anr。

37. FrameLayout只能有一个直接的子View。

38.使用枚举通常会比使用静态常量要消耗两倍以上的内存,在Android开发当中我们应当尽可能地不使用枚举。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值