Google maps 第二次打开片段时,片段内部的MapFragment未正确加载

Google maps 第二次打开片段时,片段内部的MapFragment未正确加载,google-maps,android-fragments,Google Maps,Android Fragments,我在片段中有一个mapFragment以及其他视图,当我第一次打开片段时,它工作正常,但是重新打开片段会导致一个空白(白色)屏幕 有人有同样的问题吗?或者任何人都知道如何解决这个问题。。好心帮忙 public class CostEstimationFragment extends Fragment implements OnMapReadyCallback{ private GoogleMap mMap; MapFragment mapFragment; @Override public Vi

我在片段中有一个mapFragment以及其他视图,当我第一次打开片段时,它工作正常,但是重新打开片段会导致一个空白(白色)屏幕

有人有同样的问题吗?或者任何人都知道如何解决这个问题。。好心帮忙

public class CostEstimationFragment extends Fragment implements OnMapReadyCallback{
private GoogleMap mMap;
MapFragment mapFragment;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
if (rootView != null) {
        ViewGroup parent = (ViewGroup) rootView.getParent();
        if (parent != null)
            parent.removeView(rootView);
    }
    try {
        if(savedInstanceState==null){
        rootView = inflater.inflate(R.layout.abc_layout, container,
                false);
        }

    } catch (InflateException e) {
        e.printStackTrace();

    }
    if(mMap==null)
    mMap = getMapFragment().getMap();
    mMap.clear();

    }
相应类abc_layout.XML的XML

<ScrollView>
<RelativeLayout>
<ListView/>

<LinearLayout
android:id="@+id/mapviewLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="50dp"
android:orientation="vertical" 
android:layout_below="@+id/estimateLayout"
android:padding="10dp"
android:background="@color/white"
android:elevation="2dp">


  <fragment
    android:id="@+id/map"
    class="com.google.android.gms.maps.MapFragment"
    android:layout_width="match_parent"
    android:layout_height="300dp"/> 



 </LinearLayout>

 <RelativeLayout/>
 <ScrollView/>
更新-2 增加

我需要跟踪打开的所有其他片段,以便正确导航应用程序,所以我只是更改了ft.replace(R.id.frame\u container,fragment)对于此片段

现在在LogCat中获得以下错误

  09-27 19:06:47.243: W/System.err(15481): android.view.InflateException:                   Binary XML file line #149: Error inflating class fragment
  09-27 19:06:47.243: W/System.err(15481):  at       android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:756)
  09-27 19:06:47.243: W/System.err(15481):  at       android.view.LayoutInflater.rInflate(LayoutInflater.java:798)
  09-27 19:06:47.243: W/System.err(15481):  at       android.view.LayoutInflater.rInflate(LayoutInflater.java:801)
  09-27 19:06:47.243: W/System.err(15481):  at       android.view.LayoutInflater.rInflate(LayoutInflater.java:801)
  09-27 19:06:47.243: W/System.err(15481):  at       android.view.LayoutInflater.inflate(LayoutInflater.java:520)
  09-27 19:06:47.243: W/System.err(15481):  at       android.view.LayoutInflater.inflate(LayoutInflater.java:425)
  09-27 19:06:47.243: W/System.err(15481):  at       com.radtek.tvms.CostEstimationFragment.onCreateView(CostEstimationFragment.java:      278)
  09-27 19:06:47.243: W/System.err(15481):  at       android.app.Fragment.performCreateView(Fragment.java:1700)
  09-27 19:06:47.243: W/System.err(15481):  at       android.app.FragmentManagerImpl.moveToState(FragmentManager.java:890)
  09-27 19:06:47.243: W/System.err(15481):  at       android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062)
  09-27 19:06:47.243: W/System.err(15481):  at       android.app.BackStackRecord.run(BackStackRecord.java:684)
  09-27 19:06:47.243: W/System.err(15481):  at       android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1447)
  09-27 19:06:47.243: W/System.err(15481):  at       android.app.FragmentManagerImpl$1.run(FragmentManager.java:443)
  09-27 19:06:47.243: W/System.err(15481):  at       android.os.Handler.handleCallback(Handler.java:733)
  09-27 19:06:47.253: W/System.err(15481):  at       android.os.Handler.dispatchMessage(Handler.java:95)
  09-27 19:06:47.253: W/System.err(15481):  at       android.os.Looper.loop(Looper.java:136)
  09-27 19:06:47.253: W/System.err(15481):  at       android.app.ActivityThread.main(ActivityThread.java:5027)
  09-27 19:06:47.253: W/System.err(15481):  at       java.lang.reflect.Method.invokeNative(Native Method)
  09-27 19:06:47.253: W/System.err(15481):  at       java.lang.reflect.Method.invoke(Method.java:515)
  09-27 19:06:47.253: W/System.err(15481):  at       com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:838)
  09-27 19:06:47.253: W/System.err(15481):  at       com.android.internal.os.ZygoteInit.main(ZygoteInit.java:654)
  09-27 19:06:47.253: W/System.err(15481):  at       dalvik.system.NativeStart.main(Native Method)
  09-27 19:06:47.253: W/System.err(15481): Caused by:       java.lang.IllegalArgumentException: Binary XML file line #149: Duplicate id       0x7f0b00aa, tag null, or parent id 0x7f0b00a9 with another fragment for com.google.android.gms.maps.MapFragment
  09-27 19:06:47.253: W/System.err(15481):  at       android.app.Activity.onCreateView(Activity.java:4801)
  09-27 19:06:47.253: W/System.err(15481):  at       android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:732)
  09-27 19:06:47.253: W/System.err(15481):  ... 21 more
  09-27 19:06:47.253: D/Network(15481): Network
  09-27 19:06:47.263: D/CostEstimationFragment(15481): sdk: 19
  09-27 19:06:47.263: D/CostEstimationFragment(15481): release: 4.4.2
  09-27 19:06:47.263: D/CostEstimationFragment(15481): using       getFragmentManager
  09-27 19:06:49.195: D/AndroidRuntime(15481): Shutting down VM
  09-27 19:06:49.195: W/dalvikvm(15481): threadid=1: thread exiting with       uncaught exception (group=0x42072ba8)
  09-27 19:06:49.195: E/AndroidRuntime(15481): FATAL EXCEPTION: main
  09-27 19:06:49.195: E/AndroidRuntime(15481): Process: com.radtek.tvms,       PID: 15481
  09-27 19:06:49.195: E/AndroidRuntime(15481):       java.lang.IllegalStateException: The specified child already has a parent. You       must call removeView() on the child's parent first.
  09-27 19:06:49.195: E/AndroidRuntime(15481):  at       android.view.ViewGroup.addViewInner(ViewGroup.java:3562)
  09-27 19:06:49.195: E/AndroidRuntime(15481):  at       android.view.ViewGroup.addView(ViewGroup.java:3415)
  09-27 19:06:49.195: E/AndroidRuntime(15481):  at       android.view.ViewGroup.addView(ViewGroup.java:3360)
  09-27 19:06:49.195: E/AndroidRuntime(15481):  at       android.view.ViewGroup.addView(ViewGroup.java:3336)
  09-27 19:06:49.195: E/AndroidRuntime(15481):  at       android.app.FragmentManagerImpl.moveToState(FragmentManager.java:901)
  09-27 19:06:49.195: E/AndroidRuntime(15481):  at       android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062)
  09-27 19:06:49.195: E/AndroidRuntime(15481):  at       android.app.BackStackRecord.run(BackStackRecord.java:684)
  09-27 19:06:49.195: E/AndroidRuntime(15481):  at       android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1447)
  09-27 19:06:49.195: E/AndroidRuntime(15481):  at       android.app.FragmentManagerImpl$1.run(FragmentManager.java:443)
  09-27 19:06:49.195: E/AndroidRuntime(15481):  at       android.os.Handler.handleCallback(Handler.java:733)
  09-27 19:06:49.195: E/AndroidRuntime(15481):  at       android.os.Handler.dispatchMessage(Handler.java:95)
  09-27 19:06:49.195: E/AndroidRuntime(15481):  at       android.os.Looper.loop(Looper.java:136)
  09-27 19:06:49.195: E/AndroidRuntime(15481):  at       android.app.ActivityThread.main(ActivityThread.java:5027)
  09-27 19:06:49.195: E/AndroidRuntime(15481):  at       java.lang.reflect.Method.invokeNative(Native Method)
  09-27 19:06:49.195: E/AndroidRuntime(15481):  at       java.lang.reflect.Method.invoke(Method.java:515)
  09-27 19:06:49.195: E/AndroidRuntime(15481):  at       com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:838)
  09-27 19:06:49.195: E/AndroidRuntime(15481):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:654)
  09-27 19:06:49.195: E/AndroidRuntime(15481):  at       dalvik.system.NativeStart.main(Native Method)

在片段中实现OnMapReadyCallback接口,然后像下面那样编辑代码

if(mMap==null){
  getMapFragment().getMapAsync(this);
  //remove mMap.clear();
 }
@Override
protected void onStart() {
    super.onStart();
    if(mMap==null){
      getMapFragment().getMapAsync(this);

   }
}
@Override
public void onMapReady(GoogleMap map) {
    mMap=map;
}
并更改此行:

ft.add(R.id.frame_container, fragment);

我是这样做的:

始终删除
onDestroyView()
上的MapFragment以防止
充气异常

onCreateView

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState){
  if (view != null) {
       ViewGroup parent = (ViewGroup) view.getParent();
        if (parent != null)
             parent.removeView(view);
        }
        try
        {
            view = inflater.inflate(R.layout.fragment_map_layout,null);
            MapFragment mapFragment = (MapFragment) getActivity().getFragmentManager()
                    .findFragmentById(R.id.map);
            mapFragment.getMapAsync(this);
        }catch (InflateException e) {
        /* map is already there, just return view as it is */
        }
    return view;
}
onDestroyView

@Override
public void onDestroyView() {
  super.onDestroyView();
        MapFragment mapFragment = (MapFragment) getActivity().getFragmentManager()
                .findFragmentById(R.id.map);

if (mapFragment != null){
     getActivity().getFragmentManager().beginTransaction().remove(mapFragment).commit();
    }
}

希望这能对您有所帮助。

请提供fragment classI的源代码。我已经编辑了这个问题,并添加了我的类fragment和xml中所需的部分。请尝试我的答案,让我知道在传递getMapAsync()方法getMapAsync(OnMapReadyCallback)时,我应该在getMapAsync()内传递哪个参数在类型中,MapFragment不适用于参数(Activity)“还提供您调用此片段时的代码片段我的意思是activityType不匹配:无法从void转换为GoogleMap请将“add”替换为“replace”,正如我在五月编辑回答中所说,将“add”替换为“replace”,仍然没有运气,更新了我问题中的日志更新-2将您在瓦利德的项目发送给我_sarwar@hotmail.com
ft.replace(R.id.frame_container, fragment);
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState){
  if (view != null) {
       ViewGroup parent = (ViewGroup) view.getParent();
        if (parent != null)
             parent.removeView(view);
        }
        try
        {
            view = inflater.inflate(R.layout.fragment_map_layout,null);
            MapFragment mapFragment = (MapFragment) getActivity().getFragmentManager()
                    .findFragmentById(R.id.map);
            mapFragment.getMapAsync(this);
        }catch (InflateException e) {
        /* map is already there, just return view as it is */
        }
    return view;
}
@Override
public void onDestroyView() {
  super.onDestroyView();
        MapFragment mapFragment = (MapFragment) getActivity().getFragmentManager()
                .findFragmentById(R.id.map);

if (mapFragment != null){
     getActivity().getFragmentManager().beginTransaction().remove(mapFragment).commit();
    }
}