2014-11-21 45 views
1

我正在研究一个应用程序,其中包括通过选项卡访问的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 
+0

你可以发布你的'MyActivity.PlaceholderFragment's的代码'onCreateView()'方法请求? NPE发生在该类别的第300行。 – Ridcully 2014-11-21 18:07:57

+0

您正在使用的是哪个版本的Google Play服务? – 2014-11-21 18:49:03

+0

在我的build.gradle中:'compile'c​​om.google.android.gms:play-services:6.1.71'' – kelleyb 2014-11-21 20:17:24

回答

0

您类必须扩展FragmentActivity,变标签MAP1到SupportMapFragment

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