ガイド変更履歴HERE SDK API references
ガイド

Jetpack Composeを使用してマップビューを追加する

アプリに宣言型UIを全面的に導入するには、KotlinとJetpack ComposeをMapViewクラスと組み合わせて使用します。Jetpack Composeは従来のXMLレイアウトに代わるコードベースでのUI開発を可能にし、HERE SDKとシームレスに統合できます。

Jetpack ComposeではなくXMLレイアウトを使用する場合や、XMLベースのレイアウトを使用する既存のプロジェクトで作業している場合は、XMLの実装方法について説明している「HERE SDKを統合する」セクションを参照してください。

Jetpack Composeを使用して新しいプロジェクトを作成する

Android Studio (このチュートリアルではバージョンAndroid Studio Narwhal 4 Feature Drop | 2025.1.4を使用) を起動し、次の手順を実行します。

  1. [File](ファイル) を選択し、[New Project](新規プロジェクト) をクリックします。
  2. [Phone and Tablet](携帯電話とタブレット)、[Empty Activity](空のアクティビティ) の順に選択して[Next](次へ) をクリックします。
  3. プロジェクト名として、たとえば「HelloMapKotlin」を入力します。
  4. [Minimum API level](最小APIレベル) の横でAPI 24を最小Android SDKとして設定します。
  5. [Build configuration language](設定言語をビルド) を選択します。
  6. [Save location](保存場所) で適切なディレクトリが選択されていることを確認し、[Finish](完了) をクリックして続行します。

[Empty Activity](空のアクティビティ) を選択すると、アプリでJetpack Composeを使用できます。

ウィザードが終了したら、必ず何も設定していないプロジェクトを構築し、エミュレータ (またはデバイス) でそれを実行します。すべてうまくいけば、「Hello Android」というテキストが表示されます。

プロジェクトを設定してHERE SDKを統合する

Jetpack Composeを使用してマップビューを追加する前に、次の設定手順が完了していることを確認してください。

  1. 資格情報とHERE SDKフレームワークへのアクセス権があることを確認します。詳細については、「利用開始」を参照してください。
  2. HERE SDKが正しく統合されていることを確認します。

マップビューを追加する

HERE SDKをプロジェクトに統合し、資格情報を設定したら、Jetpack Composeを使用して新しいMapViewを追加します。

MainActivity.ktを開きます。Android Studioのウィザードに従って操作した場合、Greeting()というサンプルのcomposable関数が含まれている可能性があります。このメソッドはマップビューに置き換えるので、削除してかまいません。

MainActivityクラス内に、MapViewインスタンスのメンバー変数を作成します。

private var mapView: MapView? = null

HERE SDKが提供するMapViewクラスは、通常の (composableではない) Android Viewです。Jetpack Composeでは、AndroidViewというcomposableを使って従来のAndroidビューを表示できます。 MainActivity内に次のcomposableメソッドを追加します。

@Composable
fun HereMapView(savedInstanceState: Bundle?) {
    AndroidView(factory = { ctx ->
        MapView(ctx).apply {
            setupMapView(savedInstanceState, this)
        }
    })
}

これにより、MapViewがプログラムで作成され、setupMapView()メソッドに渡され、初期化を続けます。

ここで、次のメソッドをMainActivityに追加します。これによりMapViewが初期化され、状態が復元され、マップシーンがロードされます。

private fun setupMapView(savedInstanceState: Bundle?, mapView: MapView) {
    this.mapView = mapView
    mapView.onCreate(savedInstanceState)
    mapView.onResume()
    if (savedInstanceState == null) {
        mapView.mapScene.loadScene(MapScheme.NORMAL_DAY, null)
    }
}

MapViewが未解決シンボルであるエラーが表示される場合は、自動完了ホットキーを使用してcom.here.sdk.mapview.MapViewをインポートリストに追加するか、手動で追加します。

複数のMapViewインスタンスを作成して1つの画面に同時に表示できます。

画面に地図を表示するには、MainActivityonCreate()メソッド内でcomposable関数HereMapView()を呼び出す必要があります。

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    initializeHERESDK()
    setContent {
        MyApplicationTheme {
            HereMapView(savedInstanceState)
        }
    }
}

ビルドして実行する

次に、アプリを構築して実行します。すべてがうまくいけば、ビューの全領域をカバーする HERE マップが表示されます。

Screenshot: Showing map view.


EN 日本語

HERE documentation

Find answers to your product and technical questions

Documentation

What's new

Videos

EN 日本語

HERE ドキュメント

製品や技術に関する質問の答えを見つけましょう。より多くの内容と最新の情報については、英語版をご覧ください。

ドキュメント

ダイナミックマップ

動的コンテンツ関連のAPIをアプリやサービスに活用して、ドライバーが安全・快適かつ予定どおりに目的地へ到着できるよう支援します。

地図とデータ

世界中を走行する多数のマッピング車両から得られる最新の位置情報データを活用し、精度の高い地図やカスタムレイヤーを構築できます。

最新情報

動画

(function () { const input = document.querySelector('input[data-typeahead]'); if (!input) return; // Prevent the form from submitting/navigating input.closest('form')?.addEventListener('submit', e => e.preventDefault()); input.addEventListener('input', function () { const q = this.value.trim().toLowerCase(); document.querySelectorAll('.nav-group-name').forEach(group => { let anyVisible = false; group.querySelectorAll('.nav-group-task').forEach(task => { const text = task.textContent.trim().toLowerCase(); const show = !q || text.includes(q); task.style.display = show ? '' : 'none'; if (show) anyVisible = true; }); // Hide the whole group header if nothing matches group.style.display = anyVisible || !q ? '' : 'none'; }); }); })(); (function () { function onTokenClick(event) { var link = event.target.closest('.sdk-for-ios .item .token'); if (!link) return; event.preventDefault(); console.log('token clicked', link.textContent.trim()); var item = link.closest('.item'); if (!item) return; var content = item.querySelector('.height-container'); if (!content) { console.log('no .height-container found for item', item); return; } var isHidden = window.getComputedStyle(content).display === 'none'; content.style.display = isHidden ? 'block' : 'none'; link.classList.toggle('token-open', isHidden); var href = link.getAttribute('href'); if (href) { if (history.pushState) history.pushState({}, '', href); else location.hash = href; } } function openHashTarget() { var hash = window.location.hash.slice(1); if (!hash) return; var anchor = document.querySelector('.sdk-for-ios a[name="' + hash + '"]'); if (!anchor) return; var item = anchor.closest('.item'); if (!item) return; var link = item.querySelector('.token'); var content = item.querySelector('.height-container'); if (!link || !content) return; content.style.display = 'block'; link.classList.add('token-open'); } function init() { console.log('HERE SDK accordion init'); openHashTarget(); } document.removeEventListener('click', onTokenClick); document.addEventListener('click', onTokenClick); if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', init); } else { init(); } window.addEventListener('hashchange', openHashTarget); window.addEventListener('pageLoad', init); })();