web-dev-qa-db-fra.com

Définir par programme la visibilité des fragments de carte Google (API2)

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"/>

En fragment régulier, cela se passe comme suit:

  mFragment = (mFragment) (getSupportFragmentManager().findFragmentById(R.id.mFragment));
  mFragment.getView().setVisibility(View.INVISIBLE);

Dans le fragment de carte Google:

  mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.mapFragment)).getMap();

Mais comment définir progressivement la visibilité des fragments de carte?

Ne peut pas le faire comme les autres se fragmentent.

24
David

Aussi simple que cela:

private GoogleMap mMap;
private SupportMapFragment mMapFragment;

mMapFragment = ((SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.mapFragment));
mMap = mMapFragment.getMap();

mMapFragment.getView().setVisibility(View.INVISIBLE);
62
David

Tu peux faire:

getSupportFragmentManager().beginTransaction().hide(mFragment).commit();

pour le montrer:

getSupportFragmentManager().beginTransaction().show(mFragment).commit();
22
Fernando Gallego

La réponse Par @David et @ferdy182 ont raison mais ils ne disent pas le contexte.

si vous masquez/affichez un fragment par programme, utilisez @ferdy182 et si vous voulez masquer/afficher un fragment qui est en xml. vous devez suivre @David

Laisse-moi expliquer

Si vous avez un seul frameLayout en xml et que vous souhaitez remplacer l'autre fragment dans celui-ci en particulier l'un après l'autre. utilisez ce code pour ajouter tous les fragments. ils seront placés les uns sur les autres.

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 

masquez tous les autres fragments, sauf celui que vous souhaitez afficher.

for(int j=0;j<4;j++)
        {
        getFragmentManager().beginTransaction().hide(frag[j]).commit();
        }
        getFragmentManager().beginTransaction().show(frag[0]).commit();

Avantage Ces fragments fonctionnent comme la forme en c #. Forum.show et forum.hide (); . Là où l'état actuel reste le leur. ces fragments n'appellent pas encore et encore. Un problème ici je le résous en utilisant cette technique. 2ème méthode

lorsque vous avez plusieurs FrameLayout ou fragment en XML. vous pouvez masquer ce détail en obtenant son identifiant.

private GoogleMap mMap;
private SupportMapFragment mMapFragment;

mMapFragment = ((SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.mapFragment));
mMap = mMapFragment.getMap();

mMapFragment.getView().setVisibility(View.INVISIBLE);

Codes

// pour montrer un fragment quand il est caché

FragmentManager fm = getSupportFragmentManager();
fm.beginTransaction()
          .show(fragment1)
          .commit();

// pour cacher le fragment

FragmentManager fm = getSupportFragmentManager();
fm.beginTransaction()
          .hide(fragment1)
          .commit();
1
Jawad Zeb

Au lieu de créer un SupportMapFragment en xml, il pourrait y avoir une autre approche dans laquelle nous pouvons définir un conteneur pour SupportMapFragment en xml puis charger la carte à partir de la classe.

En XML, disons que le conteneur est FrameLayout-

    <FrameLayout
        Android:id="@+id/mapContainer"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:visibility="gone" />

Dans ma classe Java qui est une Fragment, j'ai créé deux méthodes pour afficher et masquer la carte. J'ai utilisé la méthode de détachement et cela dépend des besoins. Nous pouvons également utiliser masquer au lieu de détacher.

   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();
        }
    }
0
Rahul

Seulement ça marche pour moi:

View fragmentMap = layout.findViewById(R.id.map_fragment_container_id);
fragmentMap.setVisibility(View.GONE);
0
Alexey O.