简体   繁体   English

返回主显示片段时,GoogleMap片段会使应用崩溃

[英]GoogleMap fragment crashes app when returned to main display fragment

I have a single activity that has a framelayout in its xml that eats up the majority of the display and let's different fragments come in and out of view based of the user, looks like this: 我有一个活动,它的xml中有一个framelayout,它占用了大部分显示内容,并且让不同的片段根据用户的不同而进入和显示,如下所示:

public void ShiftView(Object obj) {
        FragmentTransaction ft = getFragmentManager().beginTransaction();
        ft.replace(R.id.activity_main_framelayout, (Fragment) obj);
        ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
        ft.addToBackStack(null);
        ft.commit();
    }

I have a Track.java that is suppose to setup and show googlemaps, it does, but when I hit the back button and then try to call that fragment again, the app crashes out. 我有一个Track.java,它应该设置并显示googlemaps,但是确实如此,但是当我按下“后退”按钮,然后尝试再次调用该片段时,应用崩溃了。

Error log: 错误日志:

10-14 18:07:16.347 27723-27723/ E/AndroidRuntime: FATAL EXCEPTION: main
10-14 18:07:16.347 27723-27723/ E/AndroidRuntime: Process: , PID: 27723
10-14 18:07:16.347 27723-27723/ E/AndroidRuntime: android.view.InflateException: Binary XML file line #17: Error inflating class fragment
10-14 18:07:16.347 27723-27723/ E/AndroidRuntime:     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:770)
10-14 18:07:16.347 27723-27723/ E/AndroidRuntime:     at android.view.LayoutInflater.rInflate(LayoutInflater.java:813)
10-14 18:07:16.347 27723-27723/ E/AndroidRuntime:     at android.view.LayoutInflater.inflate(LayoutInflater.java:511)
10-14 18:07:16.347 27723-27723/ E/AndroidRuntime:     at android.view.LayoutInflater.inflate(LayoutInflater.java:415)
10-14 18:07:16.347 27723-27723/ E/AndroidRuntime:     at .Track.onCreateView(Track.java:58)
10-14 18:07:16.347 27723-27723/ E/AndroidRuntime:     at android.app.Fragment.performCreateView(Fragment.java:2114)
10-14 18:07:16.347 27723-27723/ E/AndroidRuntime:     at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:904)
10-14 18:07:16.347 27723-27723/ E/AndroidRuntime:     at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1082)
10-14 18:07:16.347 27723-27723/ E/AndroidRuntime:     at android.app.BackStackRecord.run(BackStackRecord.java:833)
10-14 18:07:16.347 27723-27723/ E/AndroidRuntime:     at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1467)
10-14 18:07:16.347 27723-27723/ E/AndroidRuntime:     at android.app.FragmentManagerImpl$1.run(FragmentManager.java:452)
10-14 18:07:16.347 27723-27723/ E/AndroidRuntime:     at android.os.Handler.handleCallback(Handler.java:739)
10-14 18:07:16.347 27723-27723/ E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:95)
10-14 18:07:16.347 27723-27723/ E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:145)
10-14 18:07:16.347 27723-27723/ E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:5972)
10-14 18:07:16.347 27723-27723/ E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Native Method)
10-14 18:07:16.347 27723-27723/ E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Method.java:372)
10-14 18:07:16.347 27723-27723/ E/AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
10-14 18:07:16.347 27723-27723/ E/AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)
10-14 18:07:16.347 27723-27723/ E/AndroidRuntime:  Caused by: java.lang.IllegalArgumentException: Binary XML file line #17: Duplicate id 0x7f0d00b6, tag null, or parent id 0xffffffff with another fragment for com.google.android.gms.maps.MapFragment
10-14 18:07:16.347 27723-27723/ E/AndroidRuntime:     at android.app.FragmentManagerImpl.onCreateView(FragmentManager.java:2135)
10-14 18:07:16.347 27723-27723/ E/AndroidRuntime:     at android.app.Activity.onCreateView(Activity.java:5610)
10-14 18:07:16.347 27723-27723/ E/AndroidRuntime:     at android.support.v7.app.AppCompatDelegateImplV11.callActivityOnCreateView(AppCompatDelegateImplV11.java:41)
10-14 18:07:16.347 27723-27723/ E/AndroidRuntime:     at android.support.v7.app.AppCompatDelegateImplV7.onCreateView(AppCompatDelegateImplV7.java:830)
10-14 18:07:16.347 27723-27723/ E/AndroidRuntime:     at android.support.v4.view.LayoutInflaterCompatHC$FactoryWrapperHC.onCreateView(LayoutInflaterCompatHC.java:44)
10-14 18:07:16.347 27723-27723/ E/AndroidRuntime:     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:732)
10-14 18:07:16.347 27723-27723/ E/AndroidRuntime:     at android.view.LayoutInflater.rInflate(LayoutInflater.java:813) 
10-14 18:07:16.347 27723-27723/ E/AndroidRuntime:     at android.view.LayoutInflater.inflate(LayoutInflater.java:511) 
10-14 18:07:16.347 27723-27723/ E/AndroidRuntime:     at android.view.LayoutInflater.inflate(LayoutInflater.java:415) 
10-14 18:07:16.347 27723-27723/ E/AndroidRuntime:     at .Track.onCreateView(Track.java:58) 
10-14 18:07:16.347 27723-27723/ E/AndroidRuntime:     at android.app.Fragment.performCreateView(Fragment.java:2114) 
10-14 18:07:16.347 27723-27723/ E/AndroidRuntime:     at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:904) 
10-14 18:07:16.347 27723-27723/ E/AndroidRuntime:     at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1082) 
10-14 18:07:16.347 27723-27723/ E/AndroidRuntime:     at android.app.BackStackRecord.run(BackStackRecord.java:833) 
10-14 18:07:16.347 27723-27723/ E/AndroidRuntime:     at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1467) 
10-14 18:07:16.347 27723-27723/ E/AndroidRuntime:     at android.app.FragmentManagerImpl$1.run(FragmentManager.java:452) 
10-14 18:07:16.347 27723-27723/ E/AndroidRuntime:     at android.os.Handler.handleCallback(Handler.java:739) 
10-14 18:07:16.347 27723-27723/ E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:95) 
10-14 18:07:16.347 27723-27723/ E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:145) 
10-14 18:07:16.347 27723-27723/ E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:5972) 
10-14 18:07:16.347 27723-27723/ E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Native Method) 
10-14 18:07:16.347 27723-27723/ E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Method.java:372) 
10-14 18:07:16.347 27723-27723/ E/AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399) 
10-14 18:07:16.347 27723-27723/ E/AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194) 

track_display.xml track_display.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent">

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


</RelativeLayout>

Track.java Track.java

import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapFragment;

public class Track extends Fragment {
    MiddleMan mCallBack;    
    MapFragment mapFragment;
    private GoogleMap googleMap;

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        try {
            mCallBack = (MiddleMan) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString() + " must implement ReqestConnect");
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.track_display, container, false);

        mCallBack.DisplayHome();
        mapFragment = ((MapFragment) getFragmentManager()
                .findFragmentById(R.id.map));
        googleMap = mapFragment.getMap();
        googleMap.setMyLocationEnabled(true);
        googleMap.getMyLocation();

        return view;
    }
}

How can I stop the crashing so it behaves like every other fragment so far? 我如何才能阻止崩溃,使它的行为像到目前为止的所有其他片段一样?

in your Track.java add this code to redraw your map 在您的Track.java中添加此代码以重绘地图

@Override
public void onDestroyView() {
    super.onDestroyView();
    MapFragment f = (MapFragment) getFragmentManager()
                                         .findFragmentById(R.id.map);
    if (f != null) 
        getFragmentManager().beginTransaction().remove(f).commit();
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM