Android - IllegalStateException:map的大小为零

时间:2012-06-24 22:53:50

标签: android google-maps android-fragments android-mapview android-fragmentactivity

我是新手android程序员。

让我给出一些背景 我的项目使用ActionBarSherlock。

  1. 我有一个包含两个片段的活动(Activity1) - 一个SherlockListFragment和一个包含谷歌地图MapView(本质上是一个MapFragment)的SherlockFragment。
  2. 搜索结果显示在列表片段和地图片段中,操作栏选项按钮切换列表和地图之间当前显示的片段。
  3. 选择列表中的项目或搜索结果地图会启动一个新活动(Activity2),显示所选项目的数据。
  4. 此新活动有类似的流程:显示数据的片段和显示位置的地图片段 - 由操作栏选项按钮切换。
  5. 问题:

    1. 我可以在搜索结果(Activity1)列表片段中选择一个列表项,并且成功启动详细信息页面(Activity2)。
    2. 当我从(Activity1)中的地图覆盖中选择一个地图项目时,应用程序崩溃,我得到如下所示的堆栈跟踪。
    3. 到目前为止我尝试过:

      1. 我搜索过“地图零大小”和相同搜索的许多排列,包括“android”和“illegalstateexception”以及堆栈跟踪的各种行,我检查过的结果甚至与android无关但是一般情况下与谷歌地图apis有关,除了在这个网址http://www.androidpub.com/1551654之外,我无法在任何地方找到任何人或任何人遇到此错误但是我不知道韩国,谷歌翻译不是很有帮助。
      2. 我试图找到源代码的一些片段,看看是怎么回事,但事实并非如此。
      3. 我在我的代码中添加了日志以尝试查明异常发生的位置,而我能够找到的所有内容都发生在(Activity2)细节活动开始后的某个时间,即onCreate之后( ) 叫做。并且详细信息片段和地图片段都已在onCreate()中成功实例化了booth。我无法在我的代码中找到一个位置来捕获异常。因此,对于我能看到的所有内容,此异常似乎完全是谷歌MapView代码中的一个错误,但如果我在任何地方犯了错误,请显示它。我愿意向任何可以告诉我这里发生了什么的人提供帮助。
      4. 总而言之。从具有当前显示的mapview的活动(Activity1)转到另一个也包含另一个mapview的片段的活动(Activity2)时发生崩溃。但是,当从(Activity1)中显示的列表片段转到包含另一个映射片段的其他活动(Activity2)时,不会发生崩溃。

        我希望这足够详细。如果您有任何问题,请发表评论。

        D/memalloc(  121): /dev/pmem: Allocated buffer base:0x4215c000 size:2088960 offset:4177920 fd:66
        D/memalloc(30944): /dev/pmem: Mapped buffer base:0x5b4f5000 size:6266880 offset:4177920 fd:164
        D/AndroidRuntime(30944): Shutting down VM
        W/dalvikvm(30944): threadid=1: thread exiting with uncaught exception (group=0x40aaa228)
        E/AndroidRuntime(30944): FATAL EXCEPTION: main
        E/AndroidRuntime(30944): java.lang.IllegalStateException: Map has zero size
        E/AndroidRuntime(30944):    at android_maps_conflict_avoidance.com.google.googlenav.map.Map.drawMap(Map.java:818)
        E/AndroidRuntime(30944):    at com.google.android.maps.MapView.drawMap(MapView.java:1091)
        E/AndroidRuntime(30944):    at com.google.android.maps.MapView.onDraw(MapView.java:522)
        E/AndroidRuntime(30944):    at android.view.View.draw(View.java:11071)
        E/AndroidRuntime(30944):    at android.view.View.getDisplayList(View.java:10462)
        E/AndroidRuntime(30944):    at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2605)
        E/AndroidRuntime(30944):    at android.view.View.getDisplayList(View.java:10425)
        E/AndroidRuntime(30944):    at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2605)
        E/AndroidRuntime(30944):    at android.view.View.getDisplayList(View.java:10425)
        E/AndroidRuntime(30944):    at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2605)
        E/AndroidRuntime(30944):    at android.view.View.getDisplayList(View.java:10425)
        E/AndroidRuntime(30944):    at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2605)
        E/AndroidRuntime(30944):    at android.view.View.getDisplayList(View.java:10425)
        E/AndroidRuntime(30944):    at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2605)
        E/AndroidRuntime(30944):    at android.view.View.getDisplayList(View.java:10425)
        E/AndroidRuntime(30944):    at android.view.HardwareRenderer$GlRenderer.draw(HardwareRenderer.java:879)
        E/AndroidRuntime(30944):    at android.view.ViewRootImpl.draw(ViewRootImpl.java:1948)
        E/AndroidRuntime(30944):    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1654)
        E/AndroidRuntime(30944):    at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2498)
        E/AndroidRuntime(30944):    at android.os.Handler.dispatchMessage(Handler.java:99)
        E/AndroidRuntime(30944):    at android.os.Looper.loop(Looper.java:154)
        E/AndroidRuntime(30944):    at android.app.ActivityThread.main(ActivityThread.java:4894)
        E/AndroidRuntime(30944):    at java.lang.reflect.Method.invokeNative(Native Method)
        E/AndroidRuntime(30944):    at java.lang.reflect.Method.invoke(Method.java:511)
        E/AndroidRuntime(30944):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
        E/AndroidRuntime(30944):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
        E/AndroidRuntime(30944):    at dalvik.system.NativeStart.main(Native Method)
        E/EmbeddedLogger(  254): App crashed! Process: com.myapp.android
        E/EmbeddedLogger(  254): App crashed! Package: com.myapp.android v5 (2.0)
        E/EmbeddedLogger(  254): Application Label: myapp
        W/ActivityManager(  254):   Force finishing activity com.myapp.android/.activity.InfoActivity
        W/ActivityManager(  254):   Force finishing activity com.myapp.android/.activity.SearchActivity
        

2 个答案:

答案 0 :(得分:0)

根据我的经验,避免此错误的唯一方法是不在Fragments中使用MapViews。一旦将MapView添加到父视图中,动画或篡改它的位置,就可以移动MapView,这一直是我的问题所在。我发现的最有效的方法是在地图和另一个视图之间切换,其中MapActivity管理MapView,而片段管理另一个视图。我再次重新实现了相同的功能,这没有任何问题。但是,我会发现这是一个导致未知原因的问题的解决方法(很可能是android maps API中的错误)。

答案 1 :(得分:0)

我绝对不同意亚当的意见!管理片段和活动是有史以来最好的做法。

这是完全不同的,有时甚至更难找到一些东西,但是如果你计划包含地图,那么将地图片段作为片段本身或在几个活动中使用的另一个片段内部管理是最好的在你的应用程序的几个视图中。

所以,说到这一点,既然你没有发布任何代码,我想你是动画相机可能是重置边界,或者可能只是为你的地图设置一个初始中心。 (很可能是第一个,因为你显示结果)

在这种情况下,异常将在map.animateCamera(...)行,因为你正在处理可用的东西,但它还没有膨胀。

试试这个:

try{
        cu = CameraUpdateFactory.newLatLngBounds(yourBoundaries,yourPadding);
        map.animateCamera(cu);
        System.out.println("Set with padding");
    } catch(IllegalStateException e) {
        e.printStackTrace();
        cu = CameraUpdateFactory.newLatLngBounds(yourBoundaries,someWidth,someHeight,zeroPadding);
        map.animateCamera(cu);
        System.out.println("Set with whp");
    }