无法修复片段 NullPointerException 中的地图片段

Posted

技术标签:

【中文标题】无法修复片段 NullPointerException 中的地图片段【英文标题】:Cannot fix Map Fragment in Fragment NullPointerException 【发布时间】:2015-09-15 01:55:24 【问题描述】:

我正在尝试在片段中显示 地图,但我总是得到这个 NullPointerException:

java.lang.NullPointerException:尝试调用虚拟方法 'com.google.android.gms.maps.GoogleMap com.google.android.gms.maps.SupportMapFragment.getMap()' 为空 对象引用

我知道在这种情况下这个例外有很多问题,但我找不到我的错误。我阅读了我找到的任何答案。

这是我的代码:

public class DetailKarteFragment extends Fragment 

GoogleMap map;

static final LatLng brend = new LatLng(48.079, 8.157);

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    View v = inflater.inflate(R.layout.fragment_detail_karte, null, false);

    FragmentTransaction ft = getFragmentManager().beginTransaction();

    map = ((SupportMapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();

    SupportMapFragment fmap = (SupportMapFragment) getFragmentManager().findFragmentById(R.id.map);

    if (fmap == null) 
        fmap = SupportMapFragment.newInstance();
        ft.add(R.id.map, fmap);
    

    ft.commit();

    Marker brendMarker = map.addMarker(new MarkerOptions().position(brend).title("Brend"));

    // Move the camera instantly to hamburg with a zoom of 15.
    map.moveCamera(CameraUpdateFactory.newLatLngZoom(brend, 15));

    // Zoom in, animating the camera.
    map.animateCamera(CameraUpdateFactory.zoomTo(10), 2000, null);

    return v;


public void onActivityCreated(Bundle savedInstanceState) 
    super.onActivityCreated(savedInstanceState);


和xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_
    android:background="@color/background"
    android:layout_>


<fragment xmlns:android="http://schemas.android.com/apk/res/android"
    android:name="com.google.android.gms.maps.SupportMapFragment"
    android:id="@+id/map"
    android:layout_
    android:layout_ />

<LinearLayout
    android:orientation="vertical"
    android:layout_
    android:layout_
    android:gravity="bottom">

    <Button
        android:layout_
        android:layout_
        android:text="Route anzeigen"
        android:id="@+id/button_route_planen"
        android:layout_gravity="center_horizontal"
        android:
        android:background="@color/secondary_100"
        android:layout_marginBottom="-48dp"/>

</LinearLayout>

</LinearLayout>

【问题讨论】:

【参考方案1】:

只需将map = (...).getMap() 行移到ft.commit() 之后。您收到该异常是因为 FragmentManager 找不到尚未被​​ added 或 replaced 放入容器的片段。

我认为更好的解决方案是:

SupportMapFragment fmap;
fmap = (SupportMapFragment) getFragmentManager().findFragmentById(R.id.map);

if (fmap == null) 
    fmap = SupportMapFragment.newInstance();
    ft.add(R.id.map, fmap);
    ft.commit();

map = fmap.getMap();

【讨论】:

fmap 肯定可以为空,但在我的示例中,我们正在检查是否为空,因此不会出现错误。更重要的是,要完成这项工作,您应该将布局中的 &lt;fragment &gt; 更改为 &lt;FrameLayout&gt; 并删除其 android:name 属性。 尝试同时将getFragmentManager() 更改为getChildFragmentManager(),因为我们在片段中使用片段。 我尝试了你所说的一切,但没有任何效果。我的地图总是空的......我也尝试了不同的组合......有没有其他方法可以将 MapFragment 放入 Fragment 中?【参考方案2】:

在检查SupportMapFragment 是否存在之前,您正在检索GoogleMap 对象映射。我假设尚未添加此片段,并且您正在对空引用调用 getMap() 方法。

【讨论】:

【参考方案3】:

我知道这个问题已经很老了......但我刚刚遇到了这个问题,我想分享发生在我身上的事情和解决方案。

我试图像您一样将 MapFragment 放入片段中。但我忘了把钥匙放在我的清单中:

<meta-data
            android:name="com.google.android.maps.v2.API_KEY"
            android:value="@string/google_maps_key" />

因此,当这种情况发生在 Activity 中时,它会引发异常。太好了,因为您的应用程序崩溃了,您可以阅读日志并了解您必须做什么!您收到此消息:

    Caused by: java.lang.RuntimeException: API key not found. 
     Check that <meta-data android:name="com.google.android.geo.API_KEY" android:value="your API key"/> 
is in the <application> element of AndroidManifest.xml

这样很容易找到需要做的事情,对吧?

但当 MapFragment 在另一个片段中时不会发生!

它只返回一个空片段......就像你现在遇到的问题一样。

所以只要把钥匙放在 Manifest 里就行了!我希望 Google 能解决这个问题,因为我花了几个小时才发现出了什么问题。

【讨论】:

以上是关于无法修复片段 NullPointerException 中的地图片段的主要内容,如果未能解决你的问题,请参考以下文章

我无法在 Home Fragment 中获取 Support Fragment?

挣扎于 Youtube 播放器支持片段

如何修复空白片段?

如何从片段 KOTLIN 中调用意图 [重复]

过滤作为 ViewPager 片段一部分的 ListView

如何使用tablayout和片段管理java文件[关闭]