在片段内部调用的Google地图返回null

时间:2016-04-27 05:39:23

标签: android google-maps

我正在尝试将Map放入片段中。 我正在粘贴我正在使用的代码

XML

           <fragment
            android:id="@+id/contactFrag_F_map"
            android:name="com.google.android.gms.maps.MapFragment"
            android:layout_width="match_parent"
            android:layout_height="200dp"/>

下面是我声明的片段名称

public class ContactFragment extends MapFragment 

以下是我初始化地图的方法

private void initilizeMap() {
    if (googleMap == null) {

        if (googleMap == null) {
            googleMap = ((MapFragment) getActivity().getFragmentManager().findFragmentById(
                    R.id.contactFrag_F_map)).getMap();
        }
        // check if map is created successfully or not
        if (googleMap == null) {
            Toast.makeText(getActivity(),
                    "Sorry! unable to create maps", Toast.LENGTH_SHORT)
                    .show();
        }
    }
}

此方法在onCreateView

上调用

错误是

Caused by: 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

请帮助解决此问题。问题出在以下部分

if (googleMap == null) {
                googleMap = ((MapFragment) getActivity().getFragmentManager().findFragmentById(
                        R.id.contactFrag_F_map)).getMap();
            }

编辑1

将xml更改为

<fragment
                android:id="@+id/contactFrag_F_map" 
                android:name="com.google.android.gms.maps.SupportMapFragment"
                android:layout_width="match_parent"
                android:layout_height="200dp"/>

public class ContactFragment extends SupportMapFragment

初始化

if (googleMap == null) {
                googleMap = ((SupportMapFragment) getActivity().getSupportFragmentManager().findFragmentById(
                        R.id.contactFrag_F_map)).getMap();
            }

但错误再次出现

java.lang.NullPointerException: Attempt to invoke virtual method 'com.google.android.gms.maps.GoogleMap com.google.android.gms.maps.SupportMapFragment.getMap()' on a null object reference

它发生在

if (googleMap == null) {
                    googleMap = ((SupportMapFragment) getActivity().getSupportFragmentManager().findFragmentById(
                            R.id.contactFrag_F_map)).getMap();
                }

为什么会发生这种情况?

编辑2

是..不推荐使用getmap。所以我试过

MapFragment mapFragment = (MapFragment) getChildFragmentManager().findFragmentById(R.id.contactFrag_F_map);
        mapFragment.getMapAsync(this);

和..

public class ContactFragment extends MapFragment implements OnMapReadyCallback { 

和回调..

@Override
    public void onMapReady(GoogleMap googleMap) {

        theGoogleMap = googleMap;

        setUpMap();
    }

和setUpMap方法

public void setUpMap(){

        theGoogleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
        theGoogleMap.setMyLocationEnabled(true);
        theGoogleMap.setTrafficEnabled(true);
        theGoogleMap.setIndoorEnabled(true);
        theGoogleMap.setBuildingsEnabled(true);
        theGoogleMap.getUiSettings().setZoomControlsEnabled(true);
    }

错误显示在onresume()

java.lang.RuntimeException: Unable to resume activity {com.purpletab.daga/com.purpletab.daga.activities.CoreActivity}: java.lang.NullPointerException: Attempt to invoke interface method 'void com.google.maps.api.android.lib6.e.fl.o()' on a null object reference

Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'void com.google.maps.api.android.lib6.e.fl.o()' on a null object reference

5 个答案:

答案 0 :(得分:8)

解决方案。 我在片段中放置了 Map Fragment

...所以

要放在片段内的xml是

 <fragment
                android:id="@+id/contactFrag_F_map"
                android:name="com.google.android.gms.maps.MapFragment"
                android:layout_width="match_parent"
                android:layout_height="200dp"/>

和..

public class ContactFragment extends Fragment implements OnMapReadyCallback {

with onCreateView()

MapFragment mapFragment = (MapFragment) getChildFragmentManager().findFragmentById(R.id.contactFrag_F_map);
        mapFragment.getMapAsync(this);

OnMapReadyCallback

@Override
    public void onMapReady(GoogleMap googleMap) {

        theGoogleMap = googleMap;

        setUpMap();
    }

以下是setUpMap。

public void setUpMap(){

        theGoogleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
        theGoogleMap.setMyLocationEnabled(true);
        theGoogleMap.setTrafficEnabled(true);
        theGoogleMap.setIndoorEnabled(true);
        theGoogleMap.setBuildingsEnabled(true);
        theGoogleMap.getUiSettings().setZoomControlsEnabled(true);
    }

工作正常.. :))

答案 1 :(得分:5)

<强>

googleMap = ((MapFragment) getActivity().getFragmentManager().findFragmentById(
                    R.id.contactFrag_F_map)).getMap();

<强>不要

googleMap = ((MapFragment) getActivity().getSupportFragmentmanager().findFragmentById(
                    R.id.contactFrag_F_map)).getMap();

<强> getSupportFragmentManager

  

返回FragmentManager以与相关的片段进行交互   通过这项活动。

答案 2 :(得分:1)

尝试使用以下代码:

private void initilizeMap() {

    FragmentManager fm = getSupportFragmentManager();
    SupportMapFragment fragment = (SupportMapFragment) fm.findFragmentById(R.id.contactFrag_F_map);
    if (fragment == null) {
        fragment = SupportMapFragment.newInstance();
    }
    mapView = fragment.getMap();
}

在您的Xml文件中:

       <fragment
            android:id="@+id/contactFrag_F_map" 
            class="com.google.android.gms.maps.SupportMapFragment"
            android:layout_width="match_parent"
            android:layout_height="200dp"
             />

答案 3 :(得分:0)

onCreateView

中的

        mMapView.onCreate(savedInstanceState);
        mMap = mMapView.getMap();
        mMap.getUiSettings().setMyLocationButtonEnabled(true);
        mMap.setMyLocationEnabled(false); 

in xml

 <com.google.android.gms.maps.MapView
   android:id="@+id/map"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:layout_below="@+id/tag_text_header" />

答案 4 :(得分:0)

首先,你从一开始就做错了 - 请参阅getMap

  

不推荐使用此方法。请改用getMapAsync(OnMapReadyCallback)。回调方法为您提供了一个保证非空并准备好使用的GoogleMap实例。

第二 - 似乎(但我不确定)你不熟悉片段嵌套,请阅读NestedFragments