Android谷歌地图getMapAsync()给出NullPointer(试过其他建议)

时间:2017-10-02 20:12:42

标签: java android google-maps android-fragments nullpointerexception

我想在片段上实现地图。但是当我调用getMapAsync()时,它会产生一个NullpointerException:

java.lang.NullPointerException: Attempt to invoke virtual method 'void com.google.android.gms.maps.SupportMapFragment.getMapAsync(com.google.android.gms.maps.OnMapReadyCallback)' on a null object reference
                                                                            at kontrolleur.radar.de.radar.fragment.MapFragment.inOnCreateView(MapFragment.java:33)

MapFragment.class:

public class MapFragment extends BaseFragment implements OnMapReadyCallback {

public static MapFragment create(){
    return new MapFragment();
}

@Override
public int getLayoutResId() {
    return R.layout.fragment_map;
}

@Override
public void inOnCreateView(View root, @Nullable ViewGroup container, Bundle savedInstanceState) {
    SupportMapFragment mapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map_container);
    mapFragment.getMapAsync(this);
}

private GoogleMap googleMap;

@Override
public void onMapReady(GoogleMap googleMap) {
    this.googleMap = googleMap;
}
}

该片段位于ViewPager顺便说一句。

这是fragment_map.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout

xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">

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

我的清单文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="kontrolleur.radar.de.radar">

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <meta-data
        android:name="com.google.android.geo.API_KEY"
        android:value="@string/google_maps_key" />
    <meta-data android:name="com.google.android.maps.v2.API_KEY"
        android:value="@string/google_maps_key" />
    <meta-data
        android:name="com.google.android.gms.version"
        android:value="@integer/google_play_services_version" />
    <activity android:name=".MainActivity"
        android:theme="@style/FullScreenTheme">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

api键位于google_maps_api.xml中并且有效。

我尝试了什么:

首先,我用一个新的SupportMapFragment实例替换了mapFragment。但这并没有奏效,并在片段上放了一个空白屏幕。

然后我试着把mapFragment.getMapAsync(this);进入不同的方法(如onCreate,onViewCreated等)。仍然是一个nullpointerexception。

我还用getActivity()替换了getChildFragmentManager()。getFragmentManager()。

我错过了什么吗?

我的MainActivity扩展了AppCompatActivity,如果有帮助,BaseFragment会扩展Fragment。

1 个答案:

答案 0 :(得分:0)

问题是,您的Fragment布局XML定义的是MapView,而不是SupportMapFragment。因此,对findFragmentById()的调用正在返回null

替换此标记:

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

用这个:

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