Остановить перезагрузку Google Map при переключении фрагментов - PullRequest
0 голосов
/ 16 мая 2018

В моем приложении я использую DrawerLayout. Когда я переключаюсь на MapFragment, который содержит SupportMapFragment и возвращаюсь к нему, Google Map снова инициализируется. Есть ли способ остановить Google Map от этого? Я использую Kotlin. Я читал об идее использования WeakReference для 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
            }
        }

Ответы [ 3 ]

0 голосов
/ 16 мая 2018

Настройте отображение таким образом,

Проверьте, не существует ли оно уже 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))
}


}
0 голосов
/ 04 апреля 2019

Использование следующих методов позволяет выполнять любые действия при отключенном фрагменте:

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

@Override
public void onDetach() {
    super.onDetach();
    //Anything you wish to do
}
0 голосов
/ 16 мая 2018

вы должны остановить фрагмент от воссоздания страниц по этому коду:

   mViewPager.setOffscreenPageLimit(NumberOfYourPages);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...