前提・実現したいこと
android studioでアプリ開発を行っています。
全くの初心者で、頓珍漢な質問をしているかもしれませんが解答いただけるとありがたいです。
##作ろうとしているアプリの概要
下部ナビゲーションアクティビティをもとにボタンの一つにGoogleMapを表示するというものです。
マップ上で、特定の複数個所にピンを立てる処理を行います。jsonファイルに緯度、経度を保存し、読み込んでピンを立てるというものです。
##現状
map単体では表示することができ、jsonファイルを読み込んでピンを立てる処理も完成しています。
発生している問題・エラーメッセージ
ただ、下部ナビゲーションアクティビティに埋め込み該当のボタンをクリックすると、アプリがクラッシュしてしまいます。ログを見たところ、NullPointerExceptionとなっており、該当の個所をNull許容型に変更しなおして起動したところ、起動はしますが、mapは表示されず、真っ白な画面が表示されるという状況です。デフォルトで用意されている下部ナビゲーションアクティビティをそのまま利用しようと考えているので、コード以外はほとんど変更しておりません。
E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.machinori, PID: 17107 java.lang.NullPointerException: null cannot be cast to non-null type com.google.android.gms.maps.SupportMapFragment at com.example.machinori.ui.dashboard.DashboardFragment.onViewCreated(DashboardFragment.kt:41) at androidx.fragment.app.Fragment.performViewCreated(Fragment.java:2987) at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:546) at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:282) at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:2189) at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:2106) at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:2002) at androidx.fragment.app.FragmentManager$5.run(FragmentManager.java:524) at android.os.Handler.handleCallback(Handler.java:938) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:223) at android.app.ActivityThread.main(ActivityThread.java:7943) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:603) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
該当のソースコード
DashboardFragment
1package com.example.machinori.ui.dashboard 2 3import android.os.Bundle 4import android.util.Log 5import android.view.LayoutInflater 6import android.view.View 7import android.view.ViewGroup 8import com.example.machinori.R 9import com.google.android.gms.maps.CameraUpdateFactory 10import com.google.android.gms.maps.GoogleMap 11import com.google.android.gms.maps.OnMapReadyCallback 12import com.google.android.gms.maps.SupportMapFragment 13import com.google.android.gms.maps.model.BitmapDescriptorFactory 14import com.google.android.gms.maps.model.LatLng 15import com.google.android.gms.maps.model.MarkerOptions 16import org.json.JSONException 17import org.json.JSONObject 18import java.io.BufferedReader 19import java.io.IOException 20import java.io.InputStreamReader 21import androidx.fragment.app.Fragment 22 23class DashboardFragment : Fragment(), OnMapReadyCallback { 24 25 private lateinit var mMap: GoogleMap 26 27 override fun onCreate(savedInstanceState: Bundle?) { 28 super.onCreate(savedInstanceState) 29 requireActivity().setTitle(R.string.title_dashboard) 30 } 31 32 override fun onCreateView( 33 inflater: LayoutInflater, 34 container: ViewGroup?, 35 savedInstanceState: Bundle? 36 ): View? { 37 return inflater.inflate(R.layout.fragment_dashboard, container, false) 38 } 39 40 override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 41 val mapFragment = childFragmentManager.findFragmentById(R.id.text_dashboard) as SupportMapFragment 42 43 mapFragment.getMapAsync(this) 44 } 45 46 47 48 49 50 override fun onMapReady(googleMap: GoogleMap) { 51 mMap = googleMap 52 53 try { 54 val data = parseJson("Machinori.json") 55 val jsonObj = data.getJSONArray("Machinori") 56 var cnt = 0 57 for (i in 0 until jsonObj.length()) { 58 val central = jsonObj.getJSONObject(i) 59 val port = Port(central) 60 googleMap.addMarker( 61 MarkerOptions() 62 .title(port.location) 63 .zIndex(10f) 64 .position(LatLng(port.lat, port.lng)) 65 .icon(BitmapDescriptorFactory.fromResource(R.drawable.baseline_directions_bike_black_18)) 66 ) 67 cnt++ 68 Log.d("debug", cnt.toString()) 69 } 70 } catch (e: IOException) { 71 e.printStackTrace() 72 } catch (e: JSONException) { 73 e.printStackTrace() 74 } 75 val kanazawa = LatLng(36.5757632, 136.6372995) 76 mMap.moveCamera(CameraUpdateFactory.newLatLng(kanazawa)) 77 } 78 79 80 class Port(json: JSONObject) { 81 var id: Int 82 var location: String 83 var lat: Double 84 var lng: Double 85 86 init { 87 id = json.getInt("id") 88 location = json.getString("name") 89 lat = json.getDouble("lat") 90 lng = json.getDouble("lng") 91 } 92 } 93 94 @Throws(JSONException::class, IOException::class) 95 private fun parseJson(file: String): JSONObject { 96 val assetManager = resources.assets 97 val inputStream= assetManager.open("Machinori.json") 98 val bufferedReader = BufferedReader(InputStreamReader(inputStream)) 99 var json: JSONObject? = null 100 var data: String? = "" 101 var str = bufferedReader.readLine() 102 while (str != null) { 103 data += str 104 str = bufferedReader.readLine() 105 } 106 json = JSONObject(data) 107 inputStream.close() 108 bufferedReader.close() 109 return json 110 } 111}
FragmentDashboard
1<?xml version="1.0" encoding="utf-8"?> 2<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:app="http://schemas.android.com/apk/res-auto" 4 xmlns:tools="http://schemas.android.com/tools" 5 android:layout_width="match_parent" 6 android:layout_height="match_parent" 7 tools:context=".ui.dashboard.DashboardFragment"> 8 9 <com.google.android.gms.maps.MapView 10 android:id="@+id/text_dashboard" 11 android:layout_width="match_parent" 12 android:layout_height="wrap_content" 13 android:layout_marginStart="8dp" 14 android:layout_marginTop="8dp" 15 android:layout_marginEnd="8dp" 16 android:textAlignment="center" 17 android:textSize="20sp" 18 app:layout_constraintBottom_toBottomOf="parent" 19 app:layout_constraintEnd_toEndOf="parent" 20 app:layout_constraintStart_toStartOf="parent" 21 app:layout_constraintTop_toTopOf="parent" 22 app:defaultNavHost="true" 23 app:navGraph="@navigation/mobile_navigation"/> 24 25 26</androidx.constraintlayout.widget.ConstraintLayout>
試したこと
MapViewをfragmentに実装する方法をいろいろ調べて試行錯誤してみたのですが、うまく実装できなかったので、どなたかわかる方教えていただけるとありがたいです。
補足情報(FW/ツールのバージョンなど)
<開発環境>
Android Studio Arctic Fox | 2020.3.1 Patch 2
Build #AI-203.7717.56.2031.7678000, built on August 27, 2021
ランタイム・バージョン: 11.0.10+0-b96-7249189 amd64
VM: OpenJDK 64-Bit Server VM by Oracle Corporation
Windows 10 10.0
GC: G1 Young Generation, G1 Old Generation
Memory: 1280M
Cores: 8
Registry: external.system.auto.import.disabled=true
Non-Bundled Plugins: org.jetbrains.kotlin
回答1件
あなたの回答
tips
プレビュー