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()
            }
*****************
    }