最近在开发中总会遇到各种坑,由于记忆力不好,先记录在这里。

以前看过的一些总结,基本上很齐全了:

http://jcodecraeer.com/plus/view.php?aid=3773

https://www.zhihu.com/question/27140400

https://github.com/jiang111/awesome-android-tips

另外自己开发中碰到的一些问题记录:

1.Glide在Listview或GridView等列表中使用时,需设置 .dontAnimate().into(ImageView)。清除默认动画,否则图片显示会有异常。

2.在使用Activity + 多个fragment模型。若出现异常崩溃后,Activity重启,会重新执行onCreate方法(此时bundle不为空),此时可能会造成第一个fragment重复添加进入FragmentManager的情况(此时会发现第一个界面会层叠在屏幕上),可根据bundle做相应的判断。另外,在一些低配手机上,按home建,当程序在后台一段时间后再次唤起,也可能会发生该情况。

3.在一个项目中,各人负责不同的模块,其中可能有控件ID命名相同的情况。当合并时不会报错可以正常运行。但最近遇到尴尬的情况,一个EditText控件的setText设置后文字不显示,但是getText获取正常。

4.关于Activity的生命周期OnDestory()和finish()。finish()执行完之后onDestory()并不会马上执行。最近碰到一个bug,重写OnDestory()方法,并在其中做了一些对象的清空操作。当打开该界面后关闭界面,再马上打开,有概率会碰到新界面打开后,延迟的onDestory()方法在oncreate()之后执行,导致数据的一些异常bug。

5.关于TextView的占行,maxlines表示最大占行。android:lines方式强制占多行。不同之处在于设置lines时,在行数不足时会用空白行填充。可用来保持数据整齐。

6.关于RadioButton。默认的button是在左边。若想将图片放在右边,可以设置android:button=“@null”,设置.setCompoundDrawable(null,null,drawable,null);将图片显示在右边。然而在4.x的手机上。即使设置了android:button=“@null”,radioButton任然会显示默认的图片。若想要默认的不显示,可以给button设置一个空的drawable:

<selector xmlns:android="http://schemas.android.com/apk/res/android">

</selector>

7.关于static静态变量。今天才发现,狂按返回键退出app,即使app看上去退出了,但是进程还在,声明的静态变量未被回收。再次启动app时任然保留之前退出前的值。所以静态变量一定慎用、慎用、慎用。

8.ViewPager使用时一般底部会有指示器显示当前页面的信息,之前一直用自定义控件或者Layout动态添加View来显示,代码一堆。最近看到其他app使用一个TextView直接搞定,特地反过来看看TextView+SpannableString来实现

/**
     * 使用方式 textView.setText(getPageText(5,2))
     * @param pageNum 指示点数目
     * @param index 第几个页面选中
     * @return
     */
    private SpannableString getPageText(int pageNum, int index) {
        StringBuilder sb = new StringBuilder();
        Drawable drawableNormal = ResourcesUtils.getDrawable(R.drawable.point_normal);
        Drawable drawableCheck = ResourcesUtils.getDrawable(R.drawable.point_check);
        for (int i = 0; i < pageNum; i++) {
            sb.append(". ");
        }
        SpannableString ss = new SpannableString(sb.toString());
        for (int i = 0; i < pageNum; i++) {
            ImageSpan is;
            if (i == index) {
                drawableCheck.setBounds(0, 0, drawableCheck.getIntrinsicWidth(),
                        drawableCheck.getIntrinsicHeight());
                is = new ImageSpan(drawableCheck, ImageSpan.ALIGN_BASELINE);
            } else {
                drawableNormal.setBounds(0, 0, drawableNormal.getIntrinsicWidth(),
                        drawableNormal.getIntrinsicHeight());
                is = new ImageSpan(drawableNormal, ImageSpan.ALIGN_BASELINE);
            }
            ss.setSpan(is, i * 2, i * 2 + 1, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
        }
        return ss;
    }

布局中TextView高度最好固定高度,不然图片显示会有异常(只显示一半,应该与控件的测量有关)。显示结果如图