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

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

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

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

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

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
}

被重载为了

@Override
public void onAttach(Context context) {
    super.onAttach(context);
}

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

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

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

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

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

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

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

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

/**
 * 利用光投射算法计算点是否在多边形内
 * 
 * @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;
}

继续阅读Android — 判断点是否位于多边形内