Android 此处映射-在TableLayout的片段中使用MapFragment

Android 此处映射-在TableLayout的片段中使用MapFragment,android,android-fragments,here-api,Android,Android Fragments,Here Api,我的应用程序有3个选项卡,其中一个选项卡中我想显示地图(这里是地图,而不是谷歌地图)。我能够使映射在活动中完美地工作,但是在片段类中,当我尝试将片段视图转换为MapFragment时,会抛出一个错误 MapFragment mapFragment = (MapFragment) getFragmentManager().findFragmentById(R.id.mapfragment); 错误: 不可撤销类型:无法将android.support.v4.ap

我的应用程序有3个选项卡,其中一个选项卡中我想显示地图(这里是地图,而不是谷歌地图)。我能够使映射在活动中完美地工作,但是在片段类中,当我尝试将片段视图转换为MapFragment时,会抛出一个错误

MapFragment mapFragment = (MapFragment) 
                getFragmentManager().findFragmentById(R.id.mapfragment);
错误: 不可撤销类型:无法将android.support.v4.app.support强制转换为com.here.android.mpa.mapping.MapFragment

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

我使用谷歌地图发现了许多与此错误相关的问题。但在使用此处映射时,只有两个(,)的错误大致相同,没有一个真正有助于解决问题

在谷歌地图中,您可以使用SupportMapFragment(),但此方法仅适用于谷歌地图。使用此处地图有什么解决方案吗?也许用不同的方法来达到相同的目标?或者我在表格布局中实现此图时遗漏了什么

任何帮助都将不胜感激

我的代码:

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_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.modulos.tabsMenu.Config">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        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_width="fill_parent"
            android:layout_height="fill_parent"/>
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:orientation="vertical"
        android:gravity="center"
        android:background="#aaa" >
            <!-- other things here -->
    </LinearLayout>
</FrameLayout>

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


您必须使用这个类com.here.android.mpa.mapping.MapFragment,可能是由于错误,您导入了这个类com.google.android.gms.maps.MapFragment

,因为here-maps SDK只适用于API级别15及以上,所以不支持兼容片段(当您针对较低的API级别时,您主要需要它)。 在某些情况下,即使以Android 4或更高版本为目标,您仍然需要处理支持片段,在这些情况下,您必须使用HERE SDK的MapView并将其嵌入到自己的布局中。 参见同样使用MapView的代码示例:

所以,它看起来是这样的:

在布局中添加地图视图:

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

处理MapEngine和MapView暂停并恢复是很重要的,否则性能会很差。

是的,我已经导入了com.here.android.mpa.mapping.MapFragment
 @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();
    }