8

google maps v2 android ładuje po raz pierwszy, a następnie przełączam się na inne fragmenty, które działają, gdy wracam do fragmentu mapy, który się zawiesza. Załączam poniższy kod: Naprawdę doceniam każdy pomoc. Dzięki za Advance. Kodandroid map v2 awarie po ponownym otwarciu w fragmencie

na mapie w fragmentMain:

kod
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; 
    } 
} 

za główną działalność:

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); 
        } 

Błąd:

 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) 

Odpowiedz

11

Wystarczy umieścić ten kod na OnDestroyView()

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

to powoduje IllegalSTateException, ponieważ chcielibyśmy zmienić stan fragmentu po wywołaniu metody onSaveINstance()! –

+0

spróbuj tego ft.commitAllowingStateLoss(); – Hardik

+0

to jest problem Api> 11 można zobaczyć tutaj http://stackoverflow.com/questions/7469082/getting-exception-ilegalstateexception-can-not-perform-thisaction-after-onsa – Hardik

5

spróbować tego na początku swojej fragmentu mapy 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

muszę dodać dowolny kod w powyższym kodzie z yours.i próbował go wklejając powyższy kod powyżej tego kodu map = ((SupportMapFragment) getFragmentManager(). FindFragmentById (R.id.map)). GetMap(); nie działa z kodem, który właśnie wkleiłem. – jason

+0

Tutaj widok musi być zadeklarowany jako statyczny – Daryn

+0

Dzięki Breadbin. – user3819810

2

mam ten sam problem, ale ustalona po to stworzyć klasę z publicznego widoku statycznych tam (z publicznym flagą zbyt statyczny) .... i wewnątrz twojego fragmentu, umieść ten kod:

View view; 
    if(Global.flag==0){ 
      view = inflater.inflate(R.layout.fragment_main, null); 
      Global.v = view; 
      Global.flag=1; 
    } 
    else{ 
     view = Global.v; 
    } 

ps: Global jest klasą publiczną z tymi statycznymi zmiennymi. w ten sposób będziesz tylko nadmuchać jeden raz i zapisać stan do odzyskania w innym czasie.

Nie wiem, czy jest to dobre rozwiązanie, ale rozwiązało moje problemy.

Sry za moją okropną gramatykę.

2

Zrobiłem coś takiego

Zobacz 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

Tutaj należy zadeklarować swój widok jako statyczny – Daryn

4

W moim przypadku wstawiłem ten kod onPause(), ponieważ miałem różne fragmaent w tym samym działaniu.

@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

Moje rozwiązanie fragmentu.

// usunąć bieżący fragmentu mapy ze stosu, aby zapobiec awarii podczas przeładowywania

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