Here Maps - 在 TabLayout 的 Fragment 中使用 MapFragment

Posted

技术标签:

【中文标题】Here Maps - 在 TabLayout 的 Fragment 中使用 MapFragment【英文标题】:Here Maps - use MapFragment in a Fragment of TabLayout 【发布时间】:2017-06-29 03:43:10 【问题描述】:

我的应用程序有 3 个选项卡,我想在其中一个选项卡中显示地图(HERE MAPS,而不是 Google 地图)。我能够让地图在 Activity 中完美运行,但是在 Fragment 类中,当我尝试将 Fragment 视图投射到 MapFragment 时会引发错误。

MapFragment mapFragment = (MapFragment) 
                getFragmentManager().findFragmentById(R.id.mapfragment);

错误: 不可转换的类型:无法将 android.support.v4.app.support 转换为 com.here.android.mpa.mapping.MapFragment

如果我错了,请纠正我,但发生这种情况的原因是因为我们不能在 android.support.v4 中使用 android.app.Fragment(用于显示地图,如 HERE MAPS DOC 中的说明) .app.Fragment(用于TabsLayout)。

我使用 Google 地图发现了许多与此错误相关的问题。但是只有两个(first,second)在使用HERE MAPS时出现了相同的错误,并且没有一个真正有助于解决问题。

在谷歌地图中,​​您可以使用 SupportMapFragment(),但此方法仅适用于谷歌地图。使用Here Maps有什么解决方案吗?也许用不同的方法来达到相同的目标?还是我在 TabLayout 中实现此 Here Maps 时遗漏了什么?

任何帮助将不胜感激!

我的代码:

MapFragment.java

  public class Map extends Fragment 
        public Map() 
        public View onCreateView(LayoutInflater inflater, ViewGroup container, 
                                 Bundle savedInstanceState) 
            View view = inflater.inflate(R.layout.fragment_map, container, false);
            MapFragment mapFragment = (MapFragment) 
                    getFragmentManager().findFragmentById(R.id.mapfragment);
            mapFragment.init(new OnEngineInitListener() 
                @Override
                public void onEngineInitializationCompleted(
                        OnEngineInitListener.Error error) 
                    if (error == OnEngineInitListener.Error.NONE) 
                        com.here.android.mpa.mapping.Map map = mapFragment.getMap();
                     else 
                        System.out.println("ERROR: Cannot initialize MapFragment");
                    
                
            ;
            return view;
        

fragment_map.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_
    tools:context="com.example.modulos.tabsMenu.Config">

    <LinearLayout
        android:layout_
        android:layout_
        android:id="@+id/mapFragmentContainer"
        android:layout_weight="1"
        android:orientation="vertical"
        android:gravity="center"
        android:background="#aaa" >

        <fragment
            class="com.here.android.mpa.mapping.MapFragment"
            android:id="@+id/mapfragment"
            android:layout_
            android:layout_/>
    </LinearLayout>

    <LinearLayout
        android:layout_
        android:layout_
        android:layout_weight="1"
        android:orientation="vertical"
        android:gravity="center"
        android:background="#aaa" >
            <!-- other things here -->
    </LinearLayout>
</FrameLayout>

【问题讨论】:

【参考方案1】:

由于 HERE Maps SDK 仅适用于 API 级别 15 及更高版本,因此不支持兼容性片段(主要在您针对较低 API 级别时需要)。 在某些情况下,即使您将 Android 4 或更高版本作为目标,您仍然希望处理支持片段,在这些情况下,您必须使用 HERE SDK 的 MapView 并将其嵌入到您自己的布局中。 请参阅此代码示例,其中还使用了 MapView:https://tcs.ext.here.com/sdk_examples/MapDownloader.zip

所以,它看起来像这样:

在您的布局中添加 MapView:

<com.here.android.mpa.mapping.MapView
    android:id="@+id/ext_mapview"
    android:visibility="visible"
    android:layout_
    android:layout_ />

然后在你的代码中:

 @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        mapView = (MapView) findViewById(R.id.ext_mapview);
        MapEngine.getInstance().init(this, engineInitHandler);
    

  private OnEngineInitListener engineInitHandler = new OnEngineInitListener() 
        @Override
        public void onEngineInitializationCompleted(Error error) 
            if (error == Error.NONE) 
                map = new Map();
                mapView.setMap(map);
                // more map initial settings
             else 
                Log.e(TAG, "ERROR: Cannot initialize MapEngine " + error);
            
        
    ;

    @Override
    public void onResume() 
        super.onResume();
        MapEngine.getInstance().onResume();
        if (mapView != null) 
            mapView.onResume();
        
    

    @Override
    public void onPause() 
        if (mapView != null) 
            mapView.onPause();
        
        MapEngine.getInstance().onPause();
        super.onPause();
    

处理 MapEngine 和 MapView 暂停和恢复很重要,否则您将获得较差的性能结果。

【讨论】:

【参考方案2】:

问这个肯定是个愚蠢的问题,但是您是否检查您是否使用了正确包中的 MapFragment?

你一定是在使用这个类com.here.android.mpa.mapping.MapFragment,也许你错误地导入了这个com.google.android.gms.maps.MapFragment。

【讨论】:

是的,我已经导入了 com.here.android.mpa.mapping.MapFragment

以上是关于Here Maps - 在 TabLayout 的 Fragment 中使用 MapFragment的主要内容,如果未能解决你的问题,请参考以下文章

小写的 TabLayout 选项卡标题文本

NMACoreRouter 是 Premium Here Maps 框架的一部分吗?

HERE Maps Distance to Destination 总是返回高值

支持室内 3D 场地的 HERE Maps 逐向导航?

如何使用 HTTPS 调用 HERE Maps API v3

如何从Here Maps API检索地点图片?