Google 返回屏幕时地图重新生成
Google map regenerating when comeback to the screen
我正在使用 MapView
列出一些目的地。但是当我进入目的地详细信息屏幕并返回到 MapView 片段时,地图正在重新生成(看起来就像第一次加载片段、获取目的地、放置标记时一样)。为什么会这样?
我尝试使用 onSaveInstanceState
保存状态,但是当我转到目的地详细信息屏幕时,这并没有调用。
private lateinit var mGoogleMap: GoogleMap
private lateinit var mMapView: MapView
*********
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
mMapView = binding.MapView
mMapView.onCreate(savedInstanceState)
mMapView.onResume()
mMapView.getMapAsync(this)
mLocationRequest = LocationRequest()
val locationManager =
activity?.getSystemService(Context.LOCATION_SERVICE) as LocationManager
if (!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
buildAlertMessageNoGps()
}
}
override fun onMapReady(googleMap: GoogleMap?) {
Log.e("onMapReady", "onMapReady")
if (googleMap != null) {
mGoogleMap = googleMap
if (checkPermission()) {
startLocationUpdates()
}
googleMap.setOnMarkerClickListener(this)
}
}
我想要的结果是,当我从详细信息页面返回片段时,地图视图屏幕应该像以前一样。我怎么可能?
我试图保存实例。但它在导航到详细信息屏幕时从不调用
override fun onSaveInstanceState(savedInstanceState: Bundle) {
// saving the last zoom, coordinates
val lat = mGoogleMap.cameraPosition.target.latitude
val lon = mGoogleMap.cameraPosition.target.longitude
val zoom = mGoogleMap.cameraPosition.zoom
savedInstanceState.putDouble("map_lat", lat)
savedInstanceState.putDouble("map_lon", lon)
savedInstanceState.putFloat("map_zoom", zoom)
Log.e("onSaveInstanceState", "onSaveInstanceState")
super.onSaveInstanceState(savedInstanceState)
}
注意:我正在使用导航组件和视图模型
我已经解决了这个问题,使用这个
创建了一个 BaseFragment 文件
open class BaseFragment : Fragment() {
var hasInitializedRootView = false
private var rootView: View? = null
fun getPersistentView(
binding: ViewBinding
): View? {
if (rootView == null) {
rootView = binding.root
} else {
(rootView?.getParent() as? ViewGroup)?.removeView(rootView)
}
return rootView
}
}
然后在我的片段上
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding = FragmentDestinationViewBinding.inflate(LayoutInflater.from(context))
return getPersistentView(
binding
)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
if (!hasInitializedRootView) {
hasInitializedRootView = true
mMapView = binding.MapView
mMapView.onCreate(savedInstanceState)
mMapView.onResume()
mMapView.getMapAsync(this)
mLocationRequest = LocationRequest()
}
*****************
}
我正在使用 MapView
列出一些目的地。但是当我进入目的地详细信息屏幕并返回到 MapView 片段时,地图正在重新生成(看起来就像第一次加载片段、获取目的地、放置标记时一样)。为什么会这样?
我尝试使用 onSaveInstanceState
保存状态,但是当我转到目的地详细信息屏幕时,这并没有调用。
private lateinit var mGoogleMap: GoogleMap
private lateinit var mMapView: MapView
*********
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
mMapView = binding.MapView
mMapView.onCreate(savedInstanceState)
mMapView.onResume()
mMapView.getMapAsync(this)
mLocationRequest = LocationRequest()
val locationManager =
activity?.getSystemService(Context.LOCATION_SERVICE) as LocationManager
if (!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
buildAlertMessageNoGps()
}
}
override fun onMapReady(googleMap: GoogleMap?) {
Log.e("onMapReady", "onMapReady")
if (googleMap != null) {
mGoogleMap = googleMap
if (checkPermission()) {
startLocationUpdates()
}
googleMap.setOnMarkerClickListener(this)
}
}
我想要的结果是,当我从详细信息页面返回片段时,地图视图屏幕应该像以前一样。我怎么可能?
我试图保存实例。但它在导航到详细信息屏幕时从不调用
override fun onSaveInstanceState(savedInstanceState: Bundle) {
// saving the last zoom, coordinates
val lat = mGoogleMap.cameraPosition.target.latitude
val lon = mGoogleMap.cameraPosition.target.longitude
val zoom = mGoogleMap.cameraPosition.zoom
savedInstanceState.putDouble("map_lat", lat)
savedInstanceState.putDouble("map_lon", lon)
savedInstanceState.putFloat("map_zoom", zoom)
Log.e("onSaveInstanceState", "onSaveInstanceState")
super.onSaveInstanceState(savedInstanceState)
}
注意:我正在使用导航组件和视图模型
我已经解决了这个问题,使用这个
创建了一个 BaseFragment 文件
open class BaseFragment : Fragment() {
var hasInitializedRootView = false
private var rootView: View? = null
fun getPersistentView(
binding: ViewBinding
): View? {
if (rootView == null) {
rootView = binding.root
} else {
(rootView?.getParent() as? ViewGroup)?.removeView(rootView)
}
return rootView
}
}
然后在我的片段上
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding = FragmentDestinationViewBinding.inflate(LayoutInflater.from(context))
return getPersistentView(
binding
)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
if (!hasInitializedRootView) {
hasInitializedRootView = true
mMapView = binding.MapView
mMapView.onCreate(savedInstanceState)
mMapView.onResume()
mMapView.getMapAsync(this)
mLocationRequest = LocationRequest()
}
*****************
}