我正在使用带有fragmentPagerAdapter的viewPager创建一个应用程序,其中包含三个片段,其中一个是Google Maps API的MapFragment。我在MainActivity的onCreate()中创建一个新片段,在创建它之后立即调用getMapAsync(),然后将片段添加到viewPager。我的MainActivity实现了OnMapReadyCallback接口:
public class MainActivity extends AppCompatActivity implements OnMapReadyCallback
{
私有MapFragment mapFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findAndInitViewPagerAndAdapter();
}
private void findAndInitViewPagerAndAdapter() {
mViewPagerAdapter = new ViewPagerAdapter(getFragmentManager());
mViewPagerAdapter.addFragment(SearchFragment.newInstance(0, mCurrentLocation), getString(R.string.first_viewPager_title));
mViewPagerAdapter.addFragment(FavoritesFragment.newInstance(1), getString(R.string.second_viewPager_title));
if (!isTwoPane) {
mViewPagerAdapter.addFragment(initMapFragment(), getString(R.string.third_viewPager_title));
}
mViewPager = (ViewPager) findViewById(R.id.viewpager);
mViewPager.setAdapter(mViewPagerAdapter);
mViewPager.setOffscreenPageLimit(2);
}
private MapFragment initMapFragment() {
mapFragment = new MapFragment();
mapFragment.getMapAsync(this);
return mapFragment;
}
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION)
!= PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission
(MainActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return;
}
if (mCurrentLocation == null) {
mCurrentLocation = mLocationsManager.getLastSavedLocationFromSharedPreferences();
}
animateCameraToPosition(mCurrentLocation.getLatitude(), mCurrentLocation.getLongitude(), 2000);
googleMap.setMyLocationEnabled(true);
googleMap.getUiSettings().setMyLocationButtonEnabled(false);
mMap.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener() {
@Override
public void onInfoWindowClick(Marker marker) {
String placeID = marker.getTag().toString();
createPlaceDetailFragment(placeID);
mBottomBar.hideBottomNavigation(true);
}
});
mMap.setOnPoiClickListener(new GoogleMap.OnPoiClickListener() {
@Override
public void onPoiClick(PointOfInterest pointOfInterest) {
createPlaceDetailFragment(pointOfInterest.placeId);
mBottomBar.hideBottomNavigation(true);
}
});
}
}
这在第一次启动应用程序时效果很好,但是当发生配置更改时,我显然无法理解的事情发生了,我的所有片段,其中的MapFragment都被重新创建,getMapAsync()方法被调用时我调试应用程序,但onMapReady回调没有,所以我没有得到一个新的GoogleMap对象。尽管如此,地图仍然是可以互动的。任何其他配置更改都不会改变这种情况。我有一个方法可以在地图上找到我的位置,另一个方法找到附近的地方,在第一次配置更改后都不会更新地图。
我缺少什么? 为什么不调用onMapReady回调?
谢谢