android 如何从片段外部清除/重置Map?

ao218c7q  于 2023-04-04  发布在  Android
关注(0)|答案(2)|浏览(137)

我有一个简单的应用程序进行测试。它有一个Android Studio默认带来的“基本活动”。还有一个GoogleMap片段显示在基本活动中(代码在帖子的末尾)。
大家都知道,基本Activity有一个像这样的浮动按钮:

主要的问题是,我是一个全新的使用片段的人,我不太明白它们是如何工作的(我正在研究它),但我想做的是:通过点击浮动按钮,Map被“重新启动”,再次重新加载并清除用户已经放置的标记。
正确的方法是什么?
我发现了几个建议,但我无法让它们工作,或者我无法看到如何正确地实现它们。我尝试的方法之一是分离和附加map片段,但这导致它崩溃并没有显示任何结果。代码如下,我将其添加到浮动按钮侦听器中:

val frg : Fragment? = supportFragmentManager.findFragmentById(R.id.map);
val frgTransac = supportFragmentManager.beginTransaction();

if (frg != null) {
    frgTransac.detach(frg);
    frgTransac.attach(frg);
    frgTransac.commit();
}

另一个选择是使用“googleMap.clear”,但我不知道如何从浮动按钮侦听器访问该对象。
我希望你能在这方面帮助我,最重要的是,理解碎片是如何工作的,以及我做错了什么。

主要活动

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        setSupportActionBar(findViewById(R.id.toolbar))
        findViewById<FloatingActionButton>(R.id.fab).setOnClickListener { view ->
//          CLEAR MAP FROM HERE
        }
    }

    override fun onCreateOptionsMenu(menu: Menu): Boolean {
        menuInflater.inflate(R.menu.menu_main, menu)
        return true
    }

    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        return when (item.itemId) {
            R.id.action_settings -> true
            else -> super.onOptionsItemSelected(item)
        }
    }
}

Map碎片

class FMaps : Fragment() {

    private val callback = OnMapReadyCallback { googleMap ->
        val sydney = LatLng(-34.0, 151.0)
        googleMap.addMarker(MarkerOptions().position(sydney).title("Marker in Sydney"))
        googleMap.moveCamera(CameraUpdateFactory.newLatLng(sydney))
    }

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        return inflater.inflate(R.layout.fragment_f_maps, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        val mapFragment = childFragmentManager.findFragmentById(R.id.map) as SupportMapFragment?
        mapFragment?.getMapAsync(callback)

    }

}
xriantvc

xriantvc1#

您可以使用在片段中定义的自定义接口,然后在按下按钮时从Activity调用(此处的示例如何创建接口:Communicating between a fragment and an activity - best practices)。当您按下按钮并调用接口时,您可以使用片段内的mapFragment?.getMapAsync(callback)刷新Map。

n6lpvg4x

n6lpvg4x2#

private GoogleMap mGoogleMap;
// initialise your GoogleMap
    

 mGoogleMap.getUiSettings().setMyLocationButtonEnabled(false);
 mGoogleMap.getUiSettings().setMapToolbarEnabled(false);
 mGoogleMap.getUiSettings().setIndoorLevelPickerEnabled(false);
 mGoogleMap.clear();
 mMarkerPositions.clear();

相关问题