2016-08-29 1 views
0

Je commence mes études sur le développement Android et je ne peux pas actualiser correctement mon application FrameLayout.Vous ne pouvez pas actualiser FrameLayout?

Ce FrameLayout (panela) tient un fragment StreetViewPanorama et chaque fois après que je retire le fragment du FrameLayout et essayer d'en ajouter un autre, les FrameLayout entiers se fige montrant la dernière image de fragment.

Vous pouvez voir mon code ci-dessous

package com.example.shanx.project_track_it_v001; 

    import android.support.v4.app.FragmentActivity; 
    import android.os.Bundle; 
    import android.util.Log; 
    import android.view.View; 
    import com.example.shanx.utilities.MapHandler; 
    import com.google.android.gms.maps.CameraUpdateFactory; 
    import com.google.android.gms.maps.GoogleMap; 
    import com.google.android.gms.maps.OnMapReadyCallback; 
    import com.google.android.gms.maps.OnStreetViewPanoramaReadyCallback; 
    import com.google.android.gms.maps.StreetViewPanorama; 
    import com.google.android.gms.maps.SupportMapFragment; 
    import com.google.android.gms.maps.model.LatLng; 
    import com.google.android.gms.maps.model.MarkerOptions; 

    public class MapsActivity extends FragmentActivity implements OnMapReadyCallback, 
                  OnStreetViewPanoramaReadyCallback { 

     private static final String INITIAL_POSITION = "Rio de Janeiro"; 

     //Application's map handler 
     private MapHandler mHandler = new MapHandler(); 

     //Application's map 
     private static GoogleMap mMap; 

     //Application's street view 
     private static StreetViewPanorama mStreetView; 

     //Application's map activity 
     public static MapsActivity mActivity; 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 

      super.onCreate(savedInstanceState); 

      //Set the Activity's layout as the content view 
      setContentView(R.layout.activity_maps); 

      // Obtain the SupportMapFragment and get notified when the map is ready to be used. 
      SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() 
      .findFragmentById(R.id.map); 

      //Set (a instance of) the callback on the fragment 
      mapFragment.getMapAsync(this); 

      mActivity = this; 

     } 

     @Override 
     public void onMapReady(GoogleMap googleMap) { 

      double latitudeArray[] = {24.345, -20.7444, 56.877, -79.2762, 77.128, 69.12, -32.111, 45.785, 77.896, -56.7888}; 
      double longitudeArray[] = {-124.345, -80.7444, 116.877, 33.2762, 177.128, 52.4567, -132.111, 25.785, 97.896, -156.7888}; 

      mMap = googleMap; 
      mHandler.setMapType(mMap, GoogleMap.MAP_TYPE_NORMAL); 

      // Add a marker in Rio de Janeiro and move the camera 
      LatLng initialPos = new LatLng(-22.907166,-43.176911); 

      mMap.addMarker(new MarkerOptions().position(initialPos).title("Marker in " + INITIAL_POSITION)); 
      mMap.moveCamera(CameraUpdateFactory.newLatLng(initialPos)); 

      //PolylineEncoder.printData(latitudeArray, longitudeArray); 

      mMap.setPadding(0, 0, 0, 100); 
      mMap.getUiSettings().setZoomControlsEnabled(true); 
      mMap.getUiSettings().setAllGesturesEnabled(true); 
      try { 
       mMap.setMyLocationEnabled(true); 
      } 
      catch(SecurityException e){ 
       e.printStackTrace(); 
      } 
      mMap.getUiSettings().setMyLocationButtonEnabled(true); 
      mMap.getUiSettings().setCompassEnabled(true); 
      mMap.setBuildingsEnabled(true); 
     } 

     @Override 
     public void onStreetViewPanoramaReady(StreetViewPanorama streetViewPanorama) { 

      mStreetView = streetViewPanorama; 
      mStreetView.setPosition(new LatLng(-22.907166,-43.176911)); 

     } 

     public void buttonPressed(View buttonPressed){ 

      mHandler.showStreetView(this); 

     } 

     public static GoogleMap getMap(){ 

      return mMap; 

     } 

     public static StreetViewPanorama getStreetView(){ 

      return mStreetView; 

     } 

    } 

Et ceci est l'autre classe:

package com.example.shanx.utilities; 
    import android.app.FragmentTransaction; 
    import android.graphics.Canvas; 
    import android.util.Log; 
    import android.view.View; 
    import com.example.shanx.project_track_it_v001.MapsActivity; 
    import com.example.shanx.project_track_it_v001.R; 
    import com.google.android.gms.maps.GoogleMap; 
    import com.google.android.gms.maps.StreetViewPanoramaFragment; 
    import com.google.android.gms.maps.StreetViewPanoramaOptions; 

    public final class MapHandler { 

     private boolean isStreetViewLoaded = false; 
     private StreetViewPanoramaFragment streetViewFragment; 
     private FragmentTransaction fragmentTransaction; 

     public void setMapType(GoogleMap map, int type){ 

      switch(type){ 
       case GoogleMap.MAP_TYPE_NONE: 
        map.setMapType(GoogleMap.MAP_TYPE_NORMAL); 
        break; 
       case GoogleMap.MAP_TYPE_TERRAIN: 
        map.setMapType(GoogleMap.MAP_TYPE_TERRAIN); 
        break; 
       case GoogleMap.MAP_TYPE_SATELLITE: 
        map.setMapType(GoogleMap.MAP_TYPE_SATELLITE); 
        break; 
       case GoogleMap.MAP_TYPE_HYBRID: 
        map.setMapType(GoogleMap.MAP_TYPE_HYBRID); 
        break; 
       default: map.setMapType(GoogleMap.MAP_TYPE_NORMAL); 
      } 

     } 

     public void showStreetView(MapsActivity activity) { 

      if (!isStreetViewLoaded) 
       addStreetView(activity); 
       else removeStreetView(activity); 

     } 

     private void addStreetView(MapsActivity activity){ 

      if((View view = activity.findViewById(R.id.panelA)) != null){ 
        view.setVisibility(View.VISIBLE); 
        view.invalidate(); 
      }  

      StreetViewPanoramaOptions streetViewOptions = new StreetViewPanoramaOptions(); 
      streetViewOptions.panningGesturesEnabled(true); 
      streetViewOptions.zoomGesturesEnabled(true); 
      streetViewOptions.streetNamesEnabled(true); 

      streetViewFragment = StreetViewPanoramaFragment.newInstance(streetViewOptions); 
      fragmentTransaction = activity.getFragmentManager().beginTransaction(); 
      //panelA is the FrameLayout that I want to show another fragment 
      fragmentTransaction.add(R.id.panelA, streetViewFragment); 
      fragmentTransaction.commit(); 

      streetViewFragment.getStreetViewPanoramaAsync(activity); 

      isStreetViewLoaded = true; 

     } 

     private void removeStreetView(MapsActivity activity){ 

      fragmentTransaction.remove(streetViewFragment);   
      //View view = activity.findViewById(R.id.panelA); 
      //view.setVisibility(View.VISIBLE); 
      //view.invalidate(); 

      isStreetViewLoaded = false; 

     } 

    } 
+1

au lieu de 'fragmentTransaction.add()' utilise 'fragmentTransaction.replace()' –

+0

@AkshayBhat, qui a fait le travail, mais pourquoi le add() -> remove() -> add() n'a pas ? Aussi, comment effacer correctement l'image exposée dans le FrameLayout? Une seule suppression n'a pas supprimé l'image précédente de la FrameLayout (je veux dire, le FrameLayout n'a pas appelé un redraw()) –

Répondre

0

Au lieu de fragmentTransaction.add() utilisation fragmentTransaction.replace(). Parce que lorsqu'un fragment existe, utilisez la méthode replace pour remplacer le fragment existant.

mais pourquoi le add() -> remove() -> add() n'a pas?

Chaque fois que vous appelez , il planifie une validation de cette transaction. La validation ne se produit pas immédiatement, elle sera planifiée comme travail sur le thread principal. Donc avant d'effectuer toute autre opération, appelez le fragmentManager.executePendingTransactions(); qui exécute immédiatement de telles opérations en attente.

A supprimer unique ne pas retiré l'image précédente du FrameLayout (je veux dire, la FrameLayout n'a pas appelé un nouveau tracé())

Il est pas le problème avec le FrameLayout. Vérifiez si vous passez le bon fragment à supprimer.