8

google maps v2 android lädt das erste mal und dann bin ich zu anderen fragmenten, die funktioniert, wenn ich zurück zu karte fragment crashes.Ich habe den code unten: Ich schätze wirklich jeden Hilfe. Vielen Dank im Voraus.android maps v2 stürzt ab, wenn in fragment wieder geöffnet

Code für Karte in fragmentMain:

public class FragmentMain extends Fragment { 
    TextView textView; 

    static final LatLng HAMBURG = new LatLng(53.558, 9.927); 
    static final LatLng test = new LatLng(53.551, 9.993); 
    private GoogleMap map; 

    public FragmentMain() { 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment_main, null); 
     map = ((SupportMapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap(); 

       Marker hamburg = map.addMarker(new MarkerOptions().position(HAMBURG) 
        .title("Hamburg")); 

       Marker test = map.addMarker(new MarkerOptions() 
        .position(test) 
        .title("test") 
        .snippet("test") 
        .icon(BitmapDescriptorFactory 
         .fromResource(R.drawable.ic_launcher))); 

       // Move the camera instantly to hamburg with a zoom of 15. 
       map.moveCamera(CameraUpdateFactory.newLatLngZoom(HAMBURG, 15)); 

       // Zoom in, animating the camera. 
       map.animateCamera(CameraUpdateFactory.zoomTo(10), 2000, null); 

     return view; 
    } 
} 

Code für MainActivity:

FragmentManager fm = MainActivity.this.getSupportFragmentManager(); 
        FragmentTransaction ft = fm.beginTransaction(); 
        Fragment fragment = null; 


        if(selectedItem.compareTo("second") == 0) { 
         fragment = new FragmentMain(); 
        } else if(selectedItem.compareTo("third") == 0) { 
         fragment = new FragmentButton(); 
        } else if(selectedItem.compareTo("first") == 0) { 
         fragment = new FragmentCheckBox(); 
        } 


        if(fragment != null) { 
         // Replace current fragment by this new one 
         ft.replace(R.id.activity_main_content_fragment, fragment); 


         ft.commit(); 
         // Set title accordingly 
         tvTitle.setText(selectedItem); 
        } 

Fehler:

 FATAL EXCEPTION: main 
android.view.InflateException: Binary XML file line #83: Error inflating class fragment 
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:713) 
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:755) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:492) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:397) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:353) 
    at com.mapsfragment.maps.FragmentMain.onCreateView(FragmentMain.java:32) 

Antwort

11

Setzen Sie einfach diesen Code auf OnDestroyView()

public void onDestroyView() 
{ 
    super.onDestroyView(); 
    Fragment fragment = (getFragmentManager().findFragmentById(R.id.map)); 
    FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction(); 
    ft.remove(fragment); 
    ft.commit(); 
} 
+0

dies verursacht IllegalSTateException, da wir versuchen würden, den Zustand des Fragments zu ändern, nachdem onSaveINstance() aufgerufen wurde! –

+0

versuchen Sie es mit diesem ft.commitAllowingStateLoss(); – Hardik

+0

Dies ist ein Problem von Api> 11 Sie können hier sehen http://StackOverflow.com/Questions/7469082/Getting-Exception-IlegalStateException-Can-Not-Perform-this-Action-after-ONSa – Hardik

5

dieses Versuchen zu Beginn Ihrer Karte Fragment onCreateView

if (view != null) { 
     ViewGroup parent = (ViewGroup) view.getParent(); 
     if (parent != null) { 
      parent.removeView(view); 
     } 
    } 
    try { 
     view = inflater.inflate(R.layout.fragment_main, container, false); 
    } catch (InflateException e) { 

    } 
+0

Nachladen tun müssen, um i innerhalb des oben genannten Code irgendeinen Code hinzufügen von yours.i versucht, durch den obigen Code über diesen Code Karte einfügen = ((SupportMapFragment) getFragmentManager(). FindFragmentById (R.id.map)). GetMap(); Es funktioniert nicht mit dem Code, den ich gerade eingefügt habe. – jason

+0

Hier muss Ihre Ansicht als statisch deklariert werden – Daryn

+0

Danke Breadbin. – user3819810

2

das gleiche Problem bekommen, aber fixierte, nachdem diese Klasse schafft mit einer öffentlichen statischen Sicht dort (mit einer öffentlichen statischen Flagge auch) .... und Innerhalb Ihres Fragments, setzen Sie diesen Code:

ps: Global ist die öffentliche Klasse mit diesen statischen Variablen. Auf diese Weise werden Sie nur einmal aufgeblasen und speichern den Zustand für die Wiederherstellung in anderen Zeiten.

ich weiß nicht, ob das ein guter pratic ist, aber löste meine Probleme.

Srey für meine schreckliche Grammatik.

2

Ich habe so etwas gemacht

Ansicht v;

public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 

    if (v != null) { 
     ViewGroup parent = (ViewGroup) v.getParent(); 
     if (parent != null) { 
      parent.removeView(v); 
     } 
    } 

    try { 
     v = inflater.inflate(R.layout.frag_admin_tab1, container, false); 

     // Getting Map for the SupportMapFragment 
     MapFragment mf = (MapFragment) this.getFragmentManager() 
       .findFragmentById(R.id.google_map); 
     GoogleMap map = mf.getMap(); 
     map.setMyLocationEnabled(true); 
     map.setMapType(GoogleMap.MAP_TYPE_NORMAL); 

     TextView tv = (TextView) v.findViewById(R.id.textView_Road); 
     tv.setText("Road"); 

     LatLng pnts[] = new LatLng[4]; 

     pnts[0] = new LatLng(0, 0); 
     pnts[1] = new LatLng(10, 0); 
     pnts[2] = new LatLng(10, 10); 
     pnts[3] = new LatLng(0, 10); 

     PolygonOptions poly = new PolygonOptions().add(pnts) 
       .fillColor(Color.argb(100, 255, 50, 50)) 
       .strokeColor(Color.GRAY).strokeWidth(0.5f); 
     map.addPolygon(poly); 
    } catch (InflateException e) { 
    } 

    v.setBackgroundColor(Color.WHITE); 

    return v; 
} 
+0

Hier muss Ihre Sicht erklärt werden als eine statische – Daryn

4

In meinem Fall habe ich diesen Code in onPause() eingefügt, weil ich in der gleichen Aktivität verschiedene Fragmaent hatte.

@Override 
public void onPause() { 
    Fragment fragment = (getFragmentManager().findFragmentById(R.id.map_tab)); 
    FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction(); 
    ft.remove(fragment); 
    ft.commit(); 
    super.onPause(); 
} 
0

Meine Lösung für Fragment.

// entfernen aktuellen Map-Fragment aus Stapel Absturz zu verhindern, während

@Override 
public void onDetach() { 
    Fragment fragment = (getFragmentManager().findFragmentById(R.id.mapView)); 
    FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction(); 
    ft.remove(fragment); 
    ft.commit(); 
    super.onDetach(); 
}