Here Maps MapView does not work in Fragment

点点圈 提交于 2019-12-23 15:43:56

问题


I am trying to implement Here Maps in Fragment but it does not work. I got lots of crashes

Crash Logs:

at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1496)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1386)
        Suppressed: java.lang.Throwable: HERE SDK Version: 3.7.0.118
        at com.nokia.maps.MapsEngine$l.uncaughtException(MapsEngine.java:378)
        at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:1068)
        at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:1063)
        Suppressed: java.lang.Throwable: HERE SDK Version: 3.7.0.118
        at com.nokia.maps.MapsEngine$l.uncaughtException(MapsEngine.java:378)
        at com.nokia.maps.MapsEngine$l.uncaughtException(MapsEngine.java:379)
        at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:1068)
        at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:1063)
     Caused by: com.here.android.mpa.common.UnintializedMapEngineException: Cannot create HERE SDK object before MapEngine is initialized. See MapEngine.init()
        at com.nokia.maps.BaseNativeObject.u(BaseNativeObject.java:39)
        at com.nokia.maps.BaseNativeObject.<init>(BaseNativeObject.java:26)
        at com.nokia.maps.MapImpl.<init>(MapImpl.java:424)
        at com.here.android.mpa.mapping.Map.<init>(Map.java:710)
        at ie.globetech.transitconnex.activity.bustrips.BusTripFragment.onEngineInitializationCompleted(BusTripFragment.java:179)
        at com.here.android.mpa.common.MapEngine.init(MapEngine.java:279)
        at ie.globetech.transitconnex.activity.bustrips.BusTripFragment.onCreate(BusTripFragment.java:136)
        at android.support.v4.app.Fragment.performCreate(Fragment.java:2331)
        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1386)
        at android.support.v4.app.FragmentTransition.addToFirstInLastOut(FragmentTransition.java:1188)
        at android.support.v4.app.FragmentTransition.calculateFragments(FragmentTransition.java:1071)
        at android.support.v4.app.FragmentTransition.startTransitions(FragmentTransition.java:115)
        at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2380)
        at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2338)
        at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2245)
        at android.support.v4.app.FragmentManagerImpl.dispatchStateChange(FragmentManager.java:3248)
        at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:3200)
        at android.support.v4.app.FragmentController.dispatchActivityCreated(FragmentController.java:195)
        at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:597)
        at ie.globetech.transitconnex.activity.bustrips.BusTripMainActivity.onStart(BusTripMainActivity.java:125)
        at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1256)
        at android.app.Activity.performStart(Activity.java:6965)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2934)
            ... 9 more

Fragment Layout:

<com.here.android.mpa.mapping.MapView
        android:id="@+id/map"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentTop="true" />

Fragment class:

    public class BusTripFragment extends Fragment{

           private Activity mActivity;
           private Map map = null;
           private MapView mapView;

             @Override
                public void onCreate(Bundle savedInstanceState) {
                    super.onCreate(savedInstanceState);
                    ApplicationContext appContext = new ApplicationContext(mActivity.getApplicationContext());
                    MapEngine.getInstance().init(appContext, this);

              }

 @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        try {
            mActivity = (Activity) activity;
            //mCallbacks = (MyNavigationDrawerCallbacks) activity;
        } catch (ClassCastException e) {}
    }


        @Override
            public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
                View view = inflater.inflate(R.layout.trip_fragment, container, false);
               mapView = (MapView) view.findViewById(R.id.map);
               return view;      
                }

    @Override
        public void onEngineInitializationCompleted(Error error) {

            // retrieve a reference of the map from the map fragment
            //map = mapFragment.getMap();

            isMapEngineInitialized = true;

            if (map == null) {
                map = new Map();
            }

            mapView.setMap(map);

            // Set the map center to the Vancouver region (no animation)
            map.setCenter(new GeoCoordinate(49.196261, -123.004773, 0.0), Map.Animation.NONE);

            // Set the zoom level to the average between min and max
            map.setZoomLevel((map.getMaxZoomLevel() + map.getMinZoomLevel()) / 2);
        }

     }

I am using HERE SDK Version: 3.7.0.118

I want through below therads

  1. HERE Map/MapView without using MapFragment

Any one has any idea how to deal with Here Maps MapView in Fragment ?


回答1:


My own solution and it worked very well. Removed MapView completely

Just added FrameLayout in layout xml of Fragment

 <FrameLayout
        android:id="@+id/simpleFrameLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentTop="true" /> 

Now, in onCreateView(...) created MapFragment dynamically and added in FrameLayout and init

    MapFragment mapFragment = new MapFragment();
    FragmentManager fm = mActivity.getFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();
    ft.replace(R.id.simpleFrameLayout, mapFragment).commit();

    mapFragment.init(mActivity, new OnEngineInitListener() {
                @Override
                public void onEngineInitializationCompleted(OnEngineInitListener.Error error) {
                    if (error == OnEngineInitListener.Error.NONE) {

                        // retrieve a reference of the map from the map fragment
                        map = mapFragment.getMap();
                    } else {
                        logger.error("ERROR: Cannot initialize Map Fragment: " + error.getStackTrace());
                    }
                }
            });



回答2:


According to the stack trace: Caused by: com.here.android.mpa.common.UnintializedMapEngineException: Cannot create HERE SDK object before MapEngine is initialized. See MapEngine.init()

And from your source code: public void onEngineInitializationCompleted(Error error) {

        // retrieve a reference of the map from the map fragment
        //map = mapFragment.getMap();

        isMapEngineInitialized = true;

... }

You are not checking for the error return code within onEngineInitializationCompleted.

The call stack you are seeing implies an error returned from the engine setup. Please print the error and we can find the proper solution.



来源:https://stackoverflow.com/questions/50523613/here-maps-mapview-does-not-work-in-fragment

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!