记录近期在 Android 开发上遇到的一些深坑

最近在开发 App 测试的时候遇到了一些坑,在这里记录一下,防止以后再遇到时又要浪费时间。

1. Fragment 中的 onAttach 方法没有被调用

在 Android 5.0 (API 21) 系统手机上测试时 App 抛出了空指针异常,而在其他测试机(均等于或高于 Android 6.0)上运行正常。
经排查发现时 Fragment 中的 OnAttach 方法没有被调用。

原来 Android 在 API 23 以后重载了 Fragment 中的 OnAttach 方法。
之前的

1
2
3
4
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
}

被重载为了

1
2
3
4
@Override
public void onAttach(Context context) {
super.onAttach(context);
}

而我在继承 Fragment 的类中只重写了第二个方法,也就是 API 23 以后的方法。
所以我们复写的 OnAttach 方法在 API 21 的手机上没有被调用。

阅读更多

Android — 判断点是否位于多边形内

最近参与一个室内AP定位的项目做Android客户端的开发。

自己写了一个静态地图控件,遇到了需要判断触摸点是否位于多边形指定区域内的问题。

网上资料很多,主流方法是利用光投射算法。Point in polygon - Wikipedia

CSDN上有一篇文章把原理讲的非常详细 点在多边形内算法——判断一个点是否在一个复杂多边形的内部

参考 StackOverFlow 上一个回答的写法,翻译成 JAVA 如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
* 利用光投射算法计算点是否在多边形内
*
* @param point 需要判断的点的坐标
* @param vertices 多边形按顺时针或逆时针顺序的顶点坐标集合
* @return 点是否在多边形内
*/
public static boolean isPointInPolygon(PointF point, List<PointF> vertices) {
boolean contains = false;
for(int i = 0, j = vertices.size() - 1; i < vertices.size(); j = i++) {
if(((vertices.get(i).y >= point.y) != (vertices.get(j).y >= point.y)) &&
(point.x <= (vertices.get(j).x - vertices.get(i).x) * (point.y - vertices.get(i).y) / (vertices.get(j).y - vertices.get(i).y) + vertices.get(i).x))
contains = !contains;
}
return contains;
}
阅读更多