2017-02-10 15 views
2

私のアプリケーションには3つのタブがあり、そのうちの1つにマップを表示したい(ここではGoogleマップではない)。私は、アクティビティで完全に動作するようにマップを取得することができましたが、フラグメントクラスでは、フラグメントビューをMapFragmentにキャストしようとするとエラーがスローされます。ここでマップ - TabLayoutのフラグメント内のMapFragmentを使用

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

エラー: Inconvetibleタイプ:com.here.android.mpa.mapping.MapFragment

をandroid.support.v4.app.supportキャストすることはできませんImが間違っているなら、私を修正しますが、してくださいこの理由は、android.support.v4.app.Fragment(TabsLayoutで使用される)にandroid.app.Fragment(HERE MAPS DOCの指示に従って地図を表示するために使用)を使用できないためです。

Googleマップを使用してこのエラーに関する多くの質問がありました。ただ2つ(firstsecond)を使用した場合、同じエラーが表示されるここでは、マップが問題を解決するのに役立ちました。

Googleマップでは、SupportMapFragment()を使用できますが、このマップはGoogleマップでのみ機能します。ここにマップを使用してこれに対する解決策はありますか?同じ目標に達するための異なるアプローチかもしれませんか?またはここでTabLayoutで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_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> 

答えて

3

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_width="match_parent" 
    android:layout_height="match_parent" /> 

とを、あなたのコード内で:

@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の一時停止と再開を処理することが重要です。そうしないと、パフォーマンスが低下します。

+0

非常に感謝しています@マルコは魅力的に働いた! – Luana

0

は確かに愚かさがこれを頼むされていますが、右からMapFragmentを使用しているかどうかをチェックしますパッケージ?

あなたは多分エラーによって、あなたはこの1つcom.google.android.gms.maps.MapFragmentをインポートし、com.here.android.mpa.mapping.MapFragmentこのクラスを使用する必要があります。

+0

はい私はcom.here.android.mpa.mapping.MapFragmentをインポートしました – Luana

関連する問題