首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SupportMapFragment和NullPointerException

SupportMapFragment和NullPointerException
EN

Stack Overflow用户
提问于 2015-03-22 20:17:05
回答 1查看 1.1K关注 0票数 0

我正在尝试使用SupportMapFragment,并得到了以下错误:

代码语言:javascript
复制
java.lang.NullPointerException: Attempt to invoke interface method 'void com.google.maps.api.android.lib6.c.c.o()' on a null object reference
        at com.google.maps.api.android.lib6.c.z.b(Unknown Source)

错误出现在这里的某个地方:

代码语言:javascript
复制
    @Override
public void onViewCreated(View view, Bundle savedInstanceState) {

    SupportMapFragment supportMapFragment;

    if (Build.VERSION.SDK_INT < 21) {
        supportMapFragment = (SupportMapFragment) getActivity().getSupportFragmentManager().findFragmentById(R.id.map);
    } else {
        supportMapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map);
    }

    supportMapFragment.getMapAsync(this);

    super.onViewCreated(view, savedInstanceState);
}

我实现了OnMapReadyCallBack:

代码语言:javascript
复制
public class MapsFragment extends SupportMapFragment implements OnMapReadyCallback {

我不知道空引用在哪里。

onCreate函数:

代码语言:javascript
复制
    @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
   // Inflate the layout for this fragment
    return inflater.inflate(R.layout.fragment_maps, container, false);
}

堆叠轨道:

代码语言:javascript
复制
03-22 22:38:07.291    3758-3758/itcc.li.lieventuregradle E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: itcc.li.lieventuregradle, PID: 3758
java.lang.NullPointerException: Attempt to invoke interface method 'void com.google.maps.api.android.lib6.c.c.o()' on a null object reference
        at com.google.maps.api.android.lib6.c.z.b(Unknown Source)
        at com.google.android.gms.maps.internal.x.onTransact(SourceFile:115)
        at android.os.Binder.transact(Binder.java:380)
        at com.google.android.gms.maps.internal.IMapFragmentDelegate$a$a.onResume(Unknown Source)
        at com.google.android.gms.maps.SupportMapFragment$a.onResume(Unknown Source)
        at com.google.android.gms.dynamic.a$7.b(Unknown Source)
        at com.google.android.gms.dynamic.a.a(Unknown Source)
        at com.google.android.gms.dynamic.a.onResume(Unknown Source)
        at com.google.android.gms.maps.SupportMapFragment.onResume(Unknown Source)
        at android.support.v4.app.Fragment.performResume(Fragment.java:1829)
        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:993)
        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1136)
        at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:739)
        at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1499)
        at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:456)
        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:5257)
        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:903)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

fragment_maps.xml:

代码语言:javascript
复制
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/root"
android:layout_width="match_parent"
android:layout_height="match_parent">
<fragment
    android:id="@+id/map"
    android:name="com.google.android.gms.maps.SupportMapFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-23 01:32:43

问题1)

如果代码中确实有下面一行(这是正确的)

代码语言:javascript
复制
public class MapsFragment extends SupportMapFragment ...

然后删除onCreateView方法。

你想把地图碎片放大成地图碎片。

问题2)

摆脱这令人憎恶的东西。

代码语言:javascript
复制
if (Build.VERSION.SDK_INT < 21) {
    supportMapFragment = (SupportMapFragment) getActivity().getSupportFragmentManager().findFragmentById(R.id.map);
} else {
    supportMapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map);
}

根据需要调用getFragmentManager()getChildFragmentManager(),从片段中访问片段管理器。这两个实例都是支持片段管理器的实例,因为您正在使用支持片段。

而且你不需要找到地图碎片,你就是它。

问题3)

尊重生命周期逻辑。在重写方法的开头调用super.onViewCreated(...),在重写方法的末尾调用super.onDestroyView() (如果要使用它)。同样,您希望该片段的祖先先初始化,最后清理。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29199367

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档