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
Post a Comment