我想在片段上实现地图。但是当我调用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。
答案 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"
/>