我正在研究一个应用程序,其中包括通过选项卡访问的MapFragment
。最近,随着Android 5.0 Lollipop的发布,我决定更新材料设计。我进行了必要的更改(在build.gradle中更改SDK,将父主题切换为android:Theme.Material.Light
等)。然而,在运行应用程序时,它会给出错误:GoogleMap NullPointerException with targetSdkVersion 21
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
你可以发布你的'MyActivity.PlaceholderFragment's的代码'onCreateView()'方法请求? NPE发生在该类别的第300行。 – Ridcully 2014-11-21 18:07:57
您正在使用的是哪个版本的Google Play服务? – 2014-11-21 18:49:03
在我的build.gradle中:'compile'com.google.android.gms:play-services:6.1.71'' – kelleyb 2014-11-21 20:17:24