谷歌地图v2 android第一次加载,然后我切换到其他片段,当我回来映射碎片它崩溃。我已经附上以下代码:我真的很感激任何帮助。谢谢提前。
fragmentMain中的map代码:
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)
答案 0 :(得分:11)
将此代码放在OnDestroyView()
上public void onDestroyView()
{
super.onDestroyView();
Fragment fragment = (getFragmentManager().findFragmentById(R.id.map));
FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
ft.remove(fragment);
ft.commit();
}
答案 1 :(得分: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) {
}
答案 2 :(得分: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();
}
答案 3 :(得分: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:Global是带有静态变量的公共类。 这样你只会膨胀一次,并在其他时候保存恢复状态。
我不知道这是不是很好,但解决了我的问题。
讽刺我可怕的语法。
答案 4 :(得分: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;
}
答案 5 :(得分:1)
我的片段解决方案。
//从堆栈中删除当前地图片段以防止重新加载时崩溃
@Override
public void onDetach() {
Fragment fragment = (getFragmentManager().findFragmentById(R.id.mapView));
FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
ft.remove(fragment);
ft.commit();
super.onDetach();
}