校园通问题总结

花了几个月的时间写校园通–华师匣子,在写的过程中碰到了一些问题,有些比较常见,所以就写个博客总结下在做项目过程中碰到的问题。后续随着版本的更新还会补充。

1.view相关

Q:Toolbar 有时候会出现 navigationicon不会居中的情况
A:这时后要设置Toolbar 的minHeight 和layout_height相同, Toolbar 控件的文档里面说明了这种情况。

Toolbar supports a more focused feature set than ActionBar. From start to end, a toolbar may contain a combination of the following optional elements:A navigation button…..The navigation button is vertically aligned within the Toolbar’s minimum height, if set.

Q:如何动态更新 menu
A:在 onPrepareOptionMenu中写上相应的显示逻辑,这个方法是在每次展现menu时调用。

Q:当登录页有背景大图时,为了让输入框不被键盘挡住会把windowSoftInputMode设置为adjustResize,但这样直接放背景图时会被压缩。
A:较好的解决办法有两种。
如果是全屏背景则直接把加入下面一行代码

1
getWindow().setBackgroundDrawable();

因为 window 在最外层,而键盘弹出时从DecorView开始Resize,其父布局的长宽仍保持不变,所以背景图不会被压缩。
如果是只需要在root_layout下的子布局中填充背景图片时,则使用以下布局

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<ScrollView
android:id="@+id/scroll_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="none">
<ImageView
android:id="@+id/img_bg"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop"
android:src="@drawable/img_background"/>
</ScrollView>

尽管ScrollView被压缩了,但里面的子 View 并不会被压缩,为了防止里面的 view 滑动可以在代码中把 ScrollView 的触摸事件给屏蔽掉。

Q:在 java 代码中添加 view 时设置 margin 属性
A: 这个问题在最开始的时候碰到过,如果直接按下列代码写则不会起作用

1
2
3
layoutParams.setMargins(0,topMargin,0,0);
view.setLayoutParams(layoutParams);
viewGroup.addView(view);

正确的写法

1
2
3
layoutparams.setMargins(0,topMargin,0,0);
view.setLayoutParams(layoutParams);
viewGroup.addView(view,layoutParams);

Q:ScrollView初始下移一段距离以及SwipeRefreshLayout初始状态为刷新。
A:如果直接写scrollTo(),setRefreshing()有可能 view 还没绘制好执行该函数不会起作用,应加入到对应view的事件队列里,这样 view 绘制完后就会执行相应逻辑。

Q:RecyclerView的状态按钮状态混乱
A:因为RecyclerView 会复用 itemView,所以解决的方法是定义一个类型为List的变量,存放已被选中的按钮的position,每次onBindViewHolder时根据当前position 是否在 List 中判断按钮的选中状态。

2.数据库

Q:数据库版本错误
A:当要重新调试时,往往新版本的数据库会与旧版本的数据库产生冲突,然而调试的时候基本上不会改数据库版本,只有正式上线后要更新 app 时才会更改数据库版本,以防 app 更新包装到用户手机后产生冲突。所以在调试时要注意数据库的版本问题,有时候更改了数据结构要把 app 重新卸了再调试比较好。

3.黑屏

Q:跳转到另外一个 Activity 时长时间黑屏,没报任何错误.
A:有很大的可能是主线程中发生了死循环,检查下自己写的循环代码,覆写的方法返回值有没有错误。

4.图片加载

Q:用 fresco 加载闪屏失败
A:这个问题出现在经过混淆后的app 中,当时闪屏默认加载的是 drawable 下的一张图片,混淆过后可能fresco找不到该目录下的图片,后来改到 assets 目录下就可以正常显示。picasso 可以正常加载,不过加载大图方面还是 fresco 性能比较好,占用内存相比 picasso 也少很多。

5.launchMode

Q:当app 还在后台运行,返回桌面点击 app 图标时再次闪屏的问题
A:把闪屏的launchMode设置为standard,app的MainActivity的 launchMode设置为 singleTask.当有多次点击按钮会产生两个Activity实例时可以吧laucnhMode设置为singleTask.