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;
}
}
au lieu de 'fragmentTransaction.add()' utilise 'fragmentTransaction.replace()' –
@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()) –