TheRedosan
TheRedosan

Reputation: 79

How to clear/reset a map from outside the fragment?

I have a simple app for testing. It has a "basic activity" that Android Studio brings by default. Also a Google maps fragment shown in the basic activity (the code is at the end of the post).

As you all know, the basic activity has a floating button like this:

Floating button on the map

The main problem is that I'm completely new to working with fragments, and I don't quite understand how they work (I am working on it) but what I want to do is that: by clicking on the floating button, the map is "restarted", reloading again and cleaning it of markers that the user has placed.

What would be the correct way to do this?

I have found several suggestions but I can't get them to work or I can't see how to implement them correctly. One of the ways I have tried is to detach and attach the map fragment, but this causes it to crash and shows no results. The code is the following, which I add in the floating button listener:

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

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

Another option is to use "googleMap.clear" but I don't know exactly how to get access to that object from the floating button listener.

I hope you can help me with this and, above all, understand how the fragments work and what I am doing wrong.

Main activity

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 Fragment

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)

    }

}

Upvotes: 1

Views: 609

Answers (2)

Akash kumar
Akash kumar

Reputation: 1053

 private GoogleMap mGoogleMap;
// initialise your GoogleMap
    

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

Upvotes: 0

UrbanR
UrbanR

Reputation: 202

You can use custom interface defined in the fragment and then called from the activity when the button is pressed (example how to create interface here: Communicating between a fragment and an activity - best practices). When you press the button and the interface is called, you can just refresh the map using mapFragment?.getMapAsync(callback) inside the fragment.

Upvotes: 1

Related Questions