Here Maps的MapView在Fragment中无法工作

3
我正在尝试在Fragment中实现Here Maps,但它无法正常工作。我遇到了许多崩溃。 崩溃日志:
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

碎片布局:

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

片段类:

    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);
        }

     }

我正在使用HERE SDK版本:3.7.0.118。
我想要查看以下线程:
  1. 不使用MapFragment的HERE Map/MapView
是否有任何想法如何在片段中处理Here Maps MapView?
2个回答

1
我自己的解决方案非常有效。完全删除了 MapView
只需在 Fragment 的布局xml中添加 FrameLayout 即可。
 <FrameLayout
        android:id="@+id/simpleFrameLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentTop="true" /> 

现在,在 onCreateView(...) 中动态创建了 MapFragment,并将其添加到 FrameLayout 中并初始化。
    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());
                    }
                }
            });

1
很高兴它对你起作用了,这基本上就是Michael建议的内容,你稍微改变了将MapFragment附加到活动的方式。但正如David所说,你完全可以避免使用MapFragment,而只使用MapView和MapEngine.init()来初始化引擎。 - NazarK

0
根据堆栈跟踪: Caused by: com.here.android.mpa.common.UnintializedMapEngineException: 在初始化MapEngine之前无法创建HERE SDK对象。请参见MapEngine.init()
并且从您的源代码中: public void onEngineInitializationCompleted(Error error) {
        // retrieve a reference of the map from the map fragment
        //map = mapFragment.getMap();

        isMapEngineInitialized = true;

...

在onEngineInitializationCompleted中,您没有检查错误返回代码。

您看到的调用堆栈意味着引擎设置返回了错误。请打印错误并我们可以找到正确的解决方案。


应用程序每次在此行 map = new Map(); 崩溃,并显示我在问题中发布的错误。如何处理片段中的地图视图? - M D
你好,根据你的情况,它失败是因为MapEngine初始化返回了一个错误代码。你上面的代码片段:onEngineInitializationCompleted(Error error)没有处理错误参数。这就是为什么你会得到运行时异常堆栈跟踪的原因。请问在onEngineInitializationCompleted中返回的错误是什么? - David Leong
我得到了解决方案。 - M D

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接