xml:
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/mapFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
class="com.google.android.gms.maps.SupportMapFragment"/>
In regular fragment it goes like this:
mFragment = (mFragment) (getSupportFragmentManager().findFragmentById(R.id.mFragment));
mFragment.getView().setVisibility(View.INVISIBLE);
In Google map fragment:
mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.mapFragment)).getMap();
But how can I set map fragment visibility progrematically?
Can't do it like others fragment.
Simple as this:
private GoogleMap mMap;
private SupportMapFragment mMapFragment;
mMapFragment = ((SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.mapFragment));
mMap = mMapFragment.getMap();
mMapFragment.getView().setVisibility(View.INVISIBLE);
You can do:
getSupportFragmentManager().beginTransaction().hide(mFragment).commit();
to show it:
getSupportFragmentManager().beginTransaction().show(mFragment).commit();
Both the answer By @David
and @ferdy182
are right but they don't told the context.
if you hide/show fragment Programmatically then use @ferdy182
and if you want to hide/show fragment which is in xml. you should follow @David
Let me explain
If you are having a single frameLayout in xml and you want to replace the other fragment in that particular one after another. use this code to add all fragment . they will be place on one another.
for(int i=0;i<4;i++)
{
getFragmentManager().beginTransaction().add(R.id.container, frag[i])
//.addToBackStack(null)
.commit();
}// add all these fragment and put them on each other then
hide all other fragment except which you want to show.
for(int j=0;j<4;j++)
{
getFragmentManager().beginTransaction().hide(frag[j]).commit();
}
getFragmentManager().beginTransaction().show(frag[0]).commit();
Benefit
These fragment work like form in c#. Forum.show and forum.hide(); . Where there current state remain their. these fragment don't call again and again. A problem here i solve it using this technique.
2nd Method
when you are having multiple frameLayout or fragment in xml . you can hide that particular by getting its id.
private GoogleMap mMap;
private SupportMapFragment mMapFragment;
mMapFragment = ((SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.mapFragment));
mMap = mMapFragment.getMap();
mMapFragment.getView().setVisibility(View.INVISIBLE);
Codes
// to show fragment when it is hidden
FragmentManager fm = getSupportFragmentManager();
fm.beginTransaction()
.show(fragment1)
.commit();
// to hide fragment
FragmentManager fm = getSupportFragmentManager();
fm.beginTransaction()
.hide(fragment1)
.commit();
Only that works for me :
View fragmentMap = layout.findViewById(R.id.map_fragment_container_id);
fragmentMap.setVisibility(View.GONE);
Instead of creating a SupportMapFragment
in xml, there could be another approach in which we can define container for SupportMapFragment
in xml and then load map from class.
In XML, let say container is FrameLayout
-
<FrameLayout
android:id="@+id/mapContainer"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="gone" />
In my java class which is a Fragment
, I have created two methods to show and hide map. I used detach and it depends on need. We can also use hide instead of detach.
private void showMap() {
mMapContainer.setVisibility(View.VISIBLE);
mSupportMapFragment = SupportMapFragment.newInstance();
getChildFragmentManager().beginTransaction()
.replace(R.id.mapContainer, mSupportMapFragment).commit();
}
private void hideMap() {
mMapContainer.setVisibility(View.VISIBLE);
if (mSupportMapFragment != null) {
getChildFragmentManager().beginTransaction()
.detach(mSupportMapFragment).commit();
}
}