
Google Map을 띄우려고 FragmentContainerView 를 쓰던 중 발견한 버그이다.
//MainActivity.kt
class MainActivity : AppCompatActivity(), OnMapReadyCallback {
private lateinit var binding:ActivityMainBinding
private lateinit var map: GoogleMap
override fun onCreate(savedInstanceState: Bundle?) {
binding = ActivityMainBinding.inflate(layoutInflater)
super.onCreate(savedInstanceState)
setContentView(binding.root)
val mapFragment = supportFragmentManager.findFragmentById(binding.mapView) as SupportMapFragment
mapFragment.getMapAsync(this)
}
override fun onMapReady(googleMap: GoogleMap) {
map = googleMap
val marker = LatLng(37.295881, 126.975931)
map.addMarker(MarkerOptions().position(marker).title("MAP"))
map.moveCamera(CameraUpdateFactory.newLatLngZoom(marker, 10F))
}
...
}
//activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_percent="0.5" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/guideline2">
<androidx.fragment.app.FragmentContainerView
android:id="@+id/mapView"
android:name="com.google.android.gms.maps.SupportMapFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
에러 내용:
Caused by: android.view.InflateException: Binary XML file line #69 in packageName:layout/activity_main:
Binary XML file line #69 in packageName:layout/activity_main:
Error inflating class androidx.fragment.app.FragmentContainerView
Caused by: android.view.InflateException: Binary XML file line #69 in packageName:layout/activity_main:
Error inflating class androidx.fragment.app.FragmentContainerView
Caused by: java.lang.NullPointerException:
Attempt to invoke virtual method 'android.content.Context androidx.fragment.app.FragmentHostCallback.getContext()' on a null object reference
at androidx.fragment.app.FragmentManager$3.instantiate(FragmentManager.java:483)
inflate 에러라고 하여 FragmentContainerView 사용에 문제가 있나 싶었지만, 원인은 Viewbinding에 있었다.
//MainActivity.kt
class MainActivity : AppCompatActivity(), OnMapReadyCallback {
private lateinit var map: GoogleMap
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val mapFragment = supportFragmentManager.findFragmentById(R.id.mapView) as SupportMapFragment
mapFragment.getMapAsync(this)
}
override fun onMapReady(googleMap: GoogleMap) {
map = googleMap
val marker = LatLng(37.295881, 126.975931)
map.addMarker(MarkerOptions().position(marker).title("MAP"))
map.moveCamera(CameraUpdateFactory.newLatLngZoom(marker, 10F))
}
...
}
viewbinding을 제거하면 에러가 해결된다.