9

谷歌地图 v2 android 首次加载,然后我切换到其他片段,当我回到地图片段时它会崩溃。我附上了下面的代码:非常感谢任何帮助。提前致谢。

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

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

错误:

 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)
4

6 回答 6

11

只需将此代码放在 OnDestroyView()

public void onDestroyView() 
 {
    super.onDestroyView(); 
    Fragment fragment = (getFragmentManager().findFragmentById(R.id.map));  
    FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
    ft.remove(fragment);
    ft.commit();
}
于 2013-11-02T10:41:00.113 回答
5

在地图片段 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) {

    }
于 2013-10-31T14:08:31.040 回答
4

就我而言,我将这段代码放在 onPause() 中,因为我在同一个活动中有不同的片段。

@Override
public void onPause() {
    Fragment fragment = (getFragmentManager().findFragmentById(R.id.map_tab));  
    FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
    ft.remove(fragment);
    ft.commit();
    super.onPause();
}
于 2014-04-02T10:35:21.380 回答
2

我做了类似的事情

查看 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;
}
于 2013-11-16T08:46:58.667 回答
2

遇到了同样的问题,但在此创建类后修复了一个公共静态视图(也有一个公共静态标志)......在你的片段内部,放置以下代码:

    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:全局是具有这些静态变量的公共类。这样你只会膨胀一次并保存状态以供其他时间恢复。

我不知道这是否是一个很好的实践,但解决了我的问题。

为我糟糕的语法道歉。

于 2013-11-11T00:35:49.603 回答
1

我的片段解决方案。

// 从堆栈中删除当前地图片段以防止重新加载时崩溃

@Override
public void onDetach() {
    Fragment fragment = (getFragmentManager().findFragmentById(R.id.mapView));  
    FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
    ft.remove(fragment);
    ft.commit();
    super.onDetach();
}
于 2015-02-27T06:21:32.553 回答