使用targetSdkVersion 21的GoogleMap NullPointerException

时间:2014-11-21 17:29:41

标签: android

我正在处理一个应用,其中包含通过标签访问的MapFragment。最近,随着Android 5.0 Lollipop的发布,我决定更新材料设计。我进行了必要的更改(在build.gradle中更改SDK,将父主题切换为android:Theme.Material.Light等)。但是,在运行应用程序时,它会显示错误:

    java.lang.NullPointerException: Attempt to invoke virtual method 'com.google.android.gms.maps.GoogleMap com.google.android.gms.maps.MapFragment.getMap()' on a null object reference
        at com.me.myapp.MyActivity$PlaceholderFragment.onCreateView(MyActivity.java:300)
        at android.app.Fragment.performCreateView(Fragment.java:2053)
        at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:894)
        at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067)
        at android.app.BackStackRecord.run(BackStackRecord.java:833)
        at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1452)
        at android.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:483)
        at android.support.v13.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:145)
        at android.support.v4.view.ViewPager.populate(ViewPager.java:1073)
        at android.support.v4.view.ViewPager.populate(ViewPager.java:919)
        at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1441)
        at android.view.View.measure(View.java:17430)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:430)
        at android.view.View.measure(View.java:17430)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
        at com.android.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:447)
        at android.view.View.measure(View.java:17430)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:430)
        at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2560)
        at android.view.View.measure(View.java:17430)
        at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2001)
        at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1166)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1372)
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1054)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5779)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767)
        at android.view.Choreographer.doCallbacks(Choreographer.java:580)
        at android.view.Choreographer.doFrame(Choreographer.java:550)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:135)
        at android.app.ActivityThread.main(ActivityThread.java:5221)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

我决定再次通过补丁,这次一次改变一件事。我发现,如果我将行targetSdkVersion 20更改为targetSdkVersion 21,则应用会因上述NullPointerException而崩溃。但是,将targetSdkVersion保留为20并不会导致错误,并且应用程序的工作方式与预期相符(包括材料设计)。

我理解getMap()可以返回null,我只是有点困惑,为什么只有在targetSdkVersion为21时才会发生这种情况。

还有其他人遇到过这个吗?我有什么不对的吗?

谢谢!

编辑:

我已离开PlaceholderFragment,但问题仍然存在。

这里是我onCreateView的相关代码:

rootView = inflater.inflate(R.layout.fragment_map, container, false);

map = ((MapFragment) getFragmentManager().findFragmentById(R.id.map1)).getMap(); // Causes NPE

1 个答案:

答案 0 :(得分:0)

您的类必须扩展FragmentActivity,并将标记map1更改为SupportMapFragment

YourActivity yourActivity = (YourActivity)getActivity();
    SupportMapFragment mapFragment = (SupportMapFragment)yourActivity.getSupportFragmentManager().findFragmentById(R.id.myFriendsMapFragment);
    map = mapFragment.getMap();