我创建了一个Android应用程序,其中:
该应用程序的工作原理,当给它的用户访问的第一次。
但是,当他转动他的设备屏幕/时,他改变了方向,地图不能被初始化。
在我的onResume方法我初始化mapFragment,如果它不等于空,我为了并初始化我的GoogleMap的地图属性做的GetMap()。
public class MapsActivity extends ActionBarActivity implements LocationListener, GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener {
...
@Override
protected void onResume() {
Log.d(LOG_TAG, "onResume");
super.onResume();
if(googleApiClient != null) {
googleApiClient.connect();
mapFragment = (MapFragment) getFragmentManager().findFragmentById(R.id.map);
if(mapFragment != null) {
Log.d(LOG_TAG, "mapFragment initialized");
} else {
Log.d(LOG_TAG, "error during mapFragment initialization");
}
map = mapFragment.getMap();
if(map != null) {
Log.d(LOG_TAG, "map initialized");
} else {
Log.d(LOG_TAG, "error during map initialization");
}
}
Log.d(LOG_TAG, "end of onResume");
}
当该活动的用户访问,它的工作:
12-17 09:35:02.306 25099-25099/com.xxx.xx D/LogMe﹕ onCreate
12-17 09:35:03.746 25099-25099/com.xxx.xx D/LogMe﹕ end of onCreate
12-17 09:35:03.748 25099-25099/com.xxx.xx D/LogMe﹕ onResume
12-17 09:35:03.759 25099-25099/com.xxx.xx D/LogMe﹕ mapFragment initialized
12-17 09:35:03.760 25099-25099/com.xxx.xx D/LogMe﹕ map initialized
12-17 09:35:03.760 25099-25099/com.xxx.xx D/LogMe﹕ end of onResume
12-17 09:35:03.844 25099-25099/com.xxx.xx D/LogMe﹕ onConnected
12-17 09:35:03.848 25099-25099/com.xxx.xx D/LogMe﹕ google play services available
12-17 09:35:03.850 25099-25099/com.xxx.xx D/LogMe﹕ setUpMapIfNeeded
12-17 09:35:03.850 25099-25099/com.xxx.xx D/LogMe﹕ we have a map
12-17 09:35:03.865 25099-25099/com.xxx.xx D/LogMe﹕ setUpMap
12-17 09:35:03.866 25099-25099/com.xxx.xx D/LogMe﹕ location: Location[mProvider=fused,mTime=1418805217845,mLatitude=43.6137752,mLongitude=1.4302528,mHasAltitude=false,mAltitude=0.0,mHasSpeed=false,mSpeed=0.0,mHasBearing=false,mBearing=0.0,mHasAccuracy=true,mAccuracy=52.5,mExtras=null]
12-17 09:35:03.867 25099-25099/com.xxx.xx D/LogMe﹕ we retrieve markers thx to the web service
但是,当他旋转手机屏幕:
12-17 09:35:25.118 25099-25099/com.xxx.xx D/LogMe﹕ onSaveInstanceState
12-17 09:35:25.119 25099-25099/com.xxx.xx D/LogMe﹕ end of onSaveInstanceState
12-17 09:35:25.260 25099-25099/com.xxx.xx D/LogMe﹕ onCreate
12-17 09:35:25.427 25099-25099/com.xxx.xx D/LogMe﹕ lat et lng: lat/lng: (43.613774948887695,1.4302530884742737)
12-17 09:35:25.428 25099-25099/com.xxx.xx D/LogMe﹕ zoom: 13.0
12-17 09:35:25.430 25099-25099/com.xxx.xx D/LogMe﹕ markers retrieved
12-17 09:35:25.462 25099-25099/com.xxx.xx D/LogMe﹕ end of onCreate
12-17 09:35:25.470 25099-25099/com.xxx.xx D/LogMe﹕ onResume
12-17 09:35:25.609 25099-25099/com.xxx.xx D/LogMe﹕ mapFragment initialized
12-17 09:35:25.609 25099-25099/com.xxx.xx D/LogMe﹕ error during map initialization
12-17 09:35:25.609 25099-25099/com.xxx.xx D/LogMe﹕ end of onResume
12-17 09:35:25.732 25099-25099/com.xxx.xx D/LogMe﹕ onConnected
12-17 09:35:25.735 25099-25099/com.xxx.xx D/LogMe﹕ google play services available
12-17 09:35:25.736 25099-25099/com.xxx.xx D/LogMe﹕ setUpMapIfNeeded
12-17 09:36:28.522 25099-25099/com.xxx.xx D/LogMe﹕ onSaveInstanceState
地图不能被初始化。
你有一个想法?
谢谢
你可以尝试得到这样的地图:
protected void onResume() {
if (mMap != null) {
// Do markers
return;
}
mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
if (mMap == null) {
return;
}
}
另外,样本项目叫做hello-map
here。它显示了map rotation.
没问题
避免使用XML来构建的MapView / SupportMapFragment。使用FrameLayout里,做一个有SupportMapFragment的新实例代替。你可以做更多的与它(加上ChildFragmentManager和更多...)。
private MapView mMapView;
private SupportMapFragment mSupportMapFragment;
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
createMapFragmentIfNeeded();
}
@Override
public void onResume() {
super.onResume();
setUpMapIfNeeded();
}
private void createMapFragmentIfNeeded() {
mFragmentManager = getChildFragmentManager();
if (mSupportMapFragment == null) {
mSupportMapFragment = createMapFragment();
FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction();
fragmentTransaction.add(R.id.map_view, mSupportMapFragment);
fragmentTransaction.commit();
}
}
public void setUpMapIfNeeded() {
if (mMap == null && mSupportMapFragment != null) {
mMap = mSupportMapFragment.getMap();
if (mMap != null) {
//Setup map
}
}
}
protected SupportMapFragment createMapFragment() {
try {
return SupportMapFragment.class.newInstance();
} catch (java.lang.InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return null;
}
我已经解决了一个新的类创建RetainMapFragment我的问题:
import android.os.Bundle;
import com.google.android.gms.maps.MapFragment;
public class RetainMapFragment extends MapFragment {
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
setRetainInstance(true);
}
}
我用我的布局这个新类:
<fragment
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="0px"
android:layout_weight="3"
android:layout_margin="5px"
class="com.xxx.xxx.RetainMapFragment"/>