java - Can't refresh FrameLayout? -


i'm starting studies android development , can't refresh app's framelayout correctly.

this framelayout (panela) holding streetviewpanorama fragment , every time after remove fragment framelayout , try add one, entire framelayout freezes showing last fragment image.

you can see code below

    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 activity's layout content view             setcontentview(r.layout.activity_maps);              // obtain supportmapfragment , notified when map ready used.             supportmapfragment mapfragment = (supportmapfragment) getsupportfragmentmanager()             .findfragmentbyid(r.id.map);              //set (a instance of) callback on 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 marker in rio de janeiro , move 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;          }      } 

and other class:

    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 framelayout want show 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;          }      } 

instead of fragmenttransaction.add() use fragmenttransaction.replace(). because when fragment exist, make use of replace method replacing existing fragment.

but why add() --> remove() --> add() didn't?

whenever call fragmenttransaction.commit(); schedules commit of transaction. commit not happen immediately, scheduled work on main thread. before doing other operation, call fragmentmanager.executependingtransactions(); executes such pending operations.

a single remove didn't not removed previous image framelayout (i mean, framelayout didn't call redraw())

it not problem framelayout. check if passing correct fragment removed.


Comments