2012-12-27 14 views
5

Ho un'attività frammento che commuta i frammenti sul clic del pulsante.
I due frammenti che ho Switch sono:Passaggio da frammento mappa a un altro Frammento e ritorno

  1. mappa di Google Android v2 frammento
  2. Un altro frammento con una vista di testo

Ecco come posso passare i frammenti:

public void onClick(View v) { 
    FragmentManager fm = getSupportFragmentManager(); 
    if(tv.getText().toString().equalsIgnoreCase("Click ME!!")){ 
     tv.setText("MAP"); 
     if (fm != null) { 
      if(map == null){  
       map = new Map(); 
      } 
      FragmentTransaction ft = fm.beginTransaction(); 
      ft.replace(R.id.lay_contaier, map); 
      ft.commit(); 

     } 
    } 
    else{ 
     tv.setText("Click ME!!"); 
     if (fm != null){ 
      FragmentTransaction ft = fm.beginTransaction(); 
      ft.replace(R.id.lay_contaier,new empty()); 
      ft.commit(); 

     } 
    } 
} 

Questo è il mio codice di Mappe di Fagment

public class Map extends Fragment implements OnMarkerClickListener, OnInfoWindowClickListener, OnMarkerDragListener { 

private static final LatLng PERTH = new LatLng(-31.952854, 115.857342); 
private static final LatLng SYDNEY = new LatLng(-33.87365, 151.20689); 


    private GoogleMap mMap; 

private Marker mPerth; 
    private Marker mSydney; 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.activity_main,null); 

     return view; 
    } 

activity_mail.xml

<?xml version="1.0" encoding="utf-8"?> 


<fragment xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/map" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
class="com.google.android.gms.maps.SupportMapFragment"/> 

Ma ogni volta che swich di nuovo alla mappa frammentare l'applicazione si blocca. Come dovrei fare questo codice giusto?

risposta

0

stai creando FragmentManager Null. rimuovere fm=null. Anche nel ciclo else stai sostituendo due frammenti. Non fare doppie sostituzioni alla volta. prima di chiamare commit(), fai una sola sostituzione

+0

Sostituiscono lo stesso layout R.id.lay_contaier –

+0

@nagaraj - ho modificato il post ma è sempre lo stesso l'app si blocca ancora – zoram

+0

nel codice che hai incollato, non c'è sbagliato. Devi mostrare altro codice per trovare l'errore – TNR

6

Sospetto che questo stia accadendo perché hai il frammento di mappa definito nel tuo file di layout XML. Al fine di scambiare frammenti in questo modo, è necessario istanziare la vostra mappa in codice, qualcosa di simile al seguente:

private void initializeMap() { 

    mMapFragment = SupportMapFragment.newInstance(); 
    FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); 
    fragmentTransaction.add(R.id.fragment_container, mMapFragment, "map"); 
    fragmentTransaction.commit(); 

    handler.post(new Runnable() { 
     @Override 
     public void run() { 
      mMap = mMapFragment.getMap(); 

      mMap.setOnCameraChangeListener(new GoogleMap.OnCameraChangeListener() { 
       @Override 
       public void onCameraChange(CameraPosition cameraPosition) { 
        // Do something here 
       } 
      }); 
     } 
    }); 
} 

ho scoperto che mMapFragment.getMap() stava tornando nulla, ecco perché è necessario programmare il resto dell'impostazione tramite un'istanza Handler. Il mio layout XML è simile al seguente:

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:id="@+id/drawer_layout" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
tools:context=".LauncherActivity"> 

<RelativeLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:id="@+id/fragment_container"> 

    <!-- The fragments will go here --> 
</RelativeLayout> 

<RelativeLayout 
    android:layout_gravity="start" 
    android:layout_height="match_parent" 
    android:layout_width="wrap_content" 
    android:background="@color/drawer_background"> 
... 
</RelativeLayout> 
</android.support.v4.widget.DrawerLayout> 

Spero che questo aiuti.

+1

Questo è praticamente un modo obsoleto per eseguire questa operazione ora, dal momento che Google Play Services 6.5 e versioni successive utilizza il metodo 'mMapFragment.getMapAsync()' per dirti quando la mappa viene inizializzata. – Thorinside

Problemi correlati