Google maps 第二次打开片段时,片段内部的MapFragment未正确加载
我在片段中有一个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
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();
}
}