2016-08-29 2 views
0

Я начинаю изучать разработку Android, и я не могу правильно обновить FrameLayout.Не удается обновить FrameLayout?

Это FrameLayout (Panela) проводит StreetViewPanorama фрагмент и каждый раз после того, как я удалить фрагмент из FrameLayout и попытаться добавить еще один, весь FrameLayout замерзает, показывая последний фрагмент изображения.

Вы можете увидеть мой код ниже

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; 

     } 

    } 

И это другой класс:

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

вместо 'fragmentTransaction.add()' use 'fragmentTransaction.replace()' –

+0

@AkshayBhat, который выполнил задание, но почему add() -> remove() -> add() не сделал ? Также, как правильно стереть изображение, которое отображается в FrameLayout? Один снимок не удалил предыдущее изображение из FrameLayout (я имею в виду, что FrameLayout не вызывал redraw()) –

ответ

0

Вместо fragmentTransaction.add() использование fragmentTransaction.replace(). Потому что, когда существует фрагмент, используйте метод replace для замены существующего фрагмента.

но почему add() -> remove() -> add() не сделал?

Всякий раз, когда вы вызываете fragmentTransaction.commit();, он планирует совершить сделку. Конец не происходит немедленно, он будет запланирован как работа над основным потоком. Поэтому перед выполнением любой другой операции вызовите fragmentManager.executePendingTransactions();, которая немедленно выполняет любые такие ожидающие операции операции.

Один удалить не не удалить предыдущее изображение из FrameLayout (я имею в виду, FrameLayout не называют перерисовки())

Это не проблема с FrameLayout. Проверьте, удаляете ли вы правильный фрагмент.

Смежные вопросы