Android - IllegalStateException:地图大小为零

Posted

技术标签:

【中文标题】Android - IllegalStateException:地图大小为零【英文标题】:Android - IllegalStateException: map has zero size 【发布时间】:2012-06-26 06:22:51 【问题描述】:

我是一名新手 android 程序员

让我提供一些背景信息。 我的项目使用 ActionBarSherlock。

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

问题:

    我可以在搜索结果(Activity1)列表片段中选择一个列表项,详细信息页面(Activity2)启动成功。 当我从 (Activity1) 中的地图叠加层中选择一个地图项时,应用程序崩溃,我得到如下所示的堆栈跟踪。

到目前为止我已经尝试过:

    我搜索了“map has zero size”和同一搜索的许多排列,包括“android”和“illegalstateexception”以及堆栈跟踪的各个行,我检查了甚至与 android 无关但一般与谷歌地图API有关,除了这个网址http://www.androidpub.com/1551654之外,我无法在任何地方找到遇到此错误的任何人或任何人但我不懂韩语,谷歌翻译并没有太大帮助. 我试图找到源代码的一些 sn-ps 以查看发生了什么,但没有任何结果。 我已经在我的代码中添加了日志以尝试查明异常发生的位置,而我所能找到的只是它发生在 (Activity2) 详细信息活动开始之后的某个时间,即 onCreate( ) 叫做。并且细节片段和地图片段都已在 onCreate() 中成功实例化。我什至无法在我的代码中找到一个位置来捕获异常。因此,就我所见,这个异常似乎完全是谷歌 MapView 代码中的一个错误,但如果我在任何地方犯了错误,请务必显示出来。我愿意向任何能告诉我这里发生了什么的人提供帮助。

所以,总而言之。当从具有当前显示地图视图的活动 (Activity1) 转到另一个活动 (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

【问题讨论】:

我在搜索相同的错误消息“地图大小为零”时发现了这个线程,我发现我不小心将另一个项目设置为“match_parent”而不是“wrap_content”,从而推动了地图视图屏幕 - 导致此错误。你确定你的布局真的可以显示 MapView 吗? 我也遇到了同样的问题,我在 XML 文件中做了一些更改 您是否对包含 mapview 的两个活动使用不同的进程。 ***.com/questions/3379575/… 能否请您也发布您的代码? 我正在做的项目是闭源的,我已经更改了代码。但是为了更新,我最终只使用了一个带有一个 MapView 的活动,并使用通过意图传递的整数作为模式来指示我希望从活动中获得哪些视图和行为。这是一个 hack,但我需要快速完成这个项目,它工作得很好,但它是混乱的代码。之后我还注意到,当我尝试为 MapView 设置动画时(我正在制作幻灯片动画),发生了同样的错误,但是当我为布局中的其他视图设置动画并且保持 MapView 不动时,没有发生异常。 【参考方案1】:

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

【讨论】:

【参考方案2】:

我完全不同意亚当的观点!管理片段和活动是有史以来的最佳实践。

这是完全不同的,有时甚至更难解决某些问题,但是如果您计划包含地图,则最好将地图片段作为片段本身或在另一个片段内部以供多个活动使用在您的应用的多个视图中。

所以,切入正题,因为您没有发布任何代码,我猜您正在为相机设置动画可能是为了重置边界,或者可能只是为您的地图设置一个初始中心。 (很可能是第一个,因为您正在显示结果)

在这种情况下,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");
    

【讨论】:

以上是关于Android - IllegalStateException:地图大小为零的主要内容,如果未能解决你的问题,请参考以下文章

databricks 错误 IllegalStateException:事务日志的完整性检查失败

Spring Batch - 如何在不同的模式上创建元数据表?

java.lang.IllegalStateException:无法从jar文件spring-plugin-core-1.2.0.RELEASE.jar的清单中读取Class-Path属性

Android逆向系列文章— Android基础逆向

Android 逆向Android 权限 ( Android 逆向中使用的 android.permission 权限 | Android 系统中的 Linux 用户权限 )

Android 逆向Android 权限 ( Android 逆向中使用的 android.permission 权限 | Android 系统中的 Linux 用户权限 )