【问题标题】:Stop Google Map from reloading when switching fragments切换片段时阻止谷歌地图重新加载
【发布时间】:2023-03-10 07:00:01
【问题描述】:

在我的应用程序中,我使用DrawerLayout。当我切换到包含SupportMapFragmentMapFragment 并返回它时,谷歌地图再次被初始化。有没有办法阻止谷歌地图这样做?我正在使用科特林。我已经阅读了关于使用 Wea​​kReference 到 MapView 的想法,但我不明白它在这种情况下有何帮助。

class MapFragment : Fragment(), OnMapReadyCallback {

    lateinit var mMap: GoogleMap

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    }

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                              savedInstanceState: Bundle?): View? {
        val view = inflater.inflate(R.layout.fragment_map, container, false)
        val mapFragment = childFragmentManager.findFragmentById((R.id.map_new)) as SupportMapFragment
        mapFragment.getMapAsync(this)
        return view
    }

    override fun onMapReady(googleMap: GoogleMap) {
        mMap = googleMap
    }


 val navigationView: NavigationView = findViewById(R.id.nav_view)
        navigationView.setNavigationItemSelectedListener {
            if(it.itemId == R.id.nav_logout){
                val intent = Intent(this, LoginActivity::class.java)
                startActivity(intent)
                true
            }
            else {
                var fragment = when (it.itemId) {
                    R.id.nav_map -> MapFragment()
                    R.id.nav_forecast -> ForecastFragment()
                    R.id.nav_app_info -> AboutFragment()
                    else -> MapFragment()
                }

                fragmentManager
                        .beginTransaction()
                        .replace(R.id.main_activity_frame, fragment)
                        .commit()
                it.isChecked = true
                drawerLayout.closeDrawers()
                true
            }
        }

【问题讨论】:

标签: android google-maps kotlin


【解决方案1】:

使用以下方法可以让您在 Fragment 关闭时执行任何操作:

@Override
public void onDestroy() {
    super.onDestroy();
    //Anything you wish to do
}

@Override
public void onDetach() {
    super.onDetach();
    //Anything you wish to do
}

【讨论】:

    【解决方案2】:

    以这种方式设置您的地图,

    检查它是否已经不存在 findFragmentById(R.id.map_new) 然后加载片段,否则使用已经加载的。

    childFragmentManager?.run {
            findFragmentById(R.id.map)?.let {
                val mapFragment = childFragmentManager.findFragmentById(R.id.map_new)
                if (mapFragment is SupportMapFragment) {
                    mapFragment.getMapAsync(this@MapFragment)
                }
            }
        }
    

    编辑:-

    这里是创建活动:-

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.act_test)
    
        supportFragmentManager.beginTransaction()
                .replace(R.id.fragment, MapFragment.getInstance())
                .addToBackStack("MapFragment")
                .commit()
    
        btnBlank.setOnClickListener {
            val frag = supportFragmentManager.findFragmentById(R.id.fragment)
            if(frag !is BlankFragment) {
                supportFragmentManager.beginTransaction()
                        .replace(R.id.fragment, BlankFragment())
                        .addToBackStack("BlankFragment")
                        .commit()
            }
        }
    
        btnMap.setOnClickListener {
            supportFragmentManager.popBackStack("MapFragment", 0)
        }
    
    }
    

    还有MapFragment:-

    class MapFragment : Fragment(), OnMapReadyCallback {
    
    private lateinit var map: GoogleMap
    
    companion object {
        private val INSTANCE = MapFragment()
        fun getInstance() = INSTANCE
    }
    
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? =
            inflater.inflate(R.layout.fragment_map, container, false)
    
    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        childFragmentManager.run {
            findFragmentById(R.id.map)?.let {
                val mapFragment = childFragmentManager.findFragmentById(R.id.map)
                if (mapFragment is SupportMapFragment) {
                    mapFragment.getMapAsync(this@MapFragment)
                }
            }
        }
    }
    
    override fun onMapReady(p0: GoogleMap?) {
        p0?.animateCamera(CameraUpdateFactory.newLatLngZoom(LatLng(
                p0.cameraPosition.target.latitude,
                p0.cameraPosition.target.longitude
        ), 14f))
    }
    
    
    }
    

    【讨论】:

    • 我试过了,但是当我切换到 MapFragment 时它并没有阻止地图刷新。
    • 也许您每次切换时都在创建新的 MapFragment。请分享您的代码,从抽屉菜单中单击您正在做什么。您可能需要通过制作 MapFragment Singlaton 来重用 MapFragment 实例。
    • companion object { private val INSTANCE = MapFragment() fun getInstance() = INSTANCE } 在 NavigationItemListener 中单击抽屉菜单后,将其添加到 MapFragment 和您使用 MapFragment() 的位置,替换为 MapFragment.getInstance()
    • 如果问题仍然存在,请告诉我。
    • 如果我输入地图片段然后再次输入地图片段会有所帮助 - 没有重新加载。但是当我切换到 AboutFragment 并返回时 - Map Fragment 再次重新加载。
    【解决方案3】:

    您必须通过此代码阻止片段重新创建页面:

       mViewPager.setOffscreenPageLimit(NumberOfYourPages);
    

    【讨论】:

      猜你喜欢
      • 2014-04-30
      • 2016-07-31
      • 1970-01-01
      • 1970-01-01
      • 2013-03-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-04
      • 1970-01-01
      相关资源
      最近更新 更多