Android kotlin.TypeCastException: null cannot be cast to non-null type com.google.android.gms.maps.SupportMapFragment

12,851

Solution 1

Try This

val mapFragment = childFragmentManager.findFragmentById(R.id.map_frag) as SupportMapFragment

mapFragment.getMapAsync(this)

Solution 2

The compilation error is pointing to the following line in your code:

val mapFragment = supportFragmentManager
            .findFragmentById(R.id.mapFragment) as SupportMapFragment

Here, you are typecasting something which is nullable, i.e. the return value of findFragmentById, to something that you have defined as non-nullable type, i.e. SupportMapFragment

Ideally, you should read about Kotlin null handling. It is quick read and should not take time and will clear your understanding here.

And, when you come back, you will see that there are more than one of ways of fixing your code, such as:

(activity.supportFragmentManager.findFragmentById(fragmentId) as SupportMapFragment?)?.let {
    it.getMapAsync(this)
}

Quick tip: The difference between a nullable and non-nullable type in Kotlin is a ? postfixed to the type. So, here, SupportMapFragment? specifies that the type is SupportMapFragment and it can be null.

Solution 3

val mapFragment = supportFragmentManager.findFragmentById(R.id.mapFragment) as? SupportMapFragment
mapFragment?.getMapAsync(this)

For reference, you should read this

Solution 4

if you are using SupportMapFragment in a Fragment you have to write "childFragmentManager.findFragmentById(R.id.myMap)" statement in

override fun onViewCreated(view: View, savedInstanceState: Bundle?)

not in

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View?
Share:
12,851
Admin
Author by

Admin

Updated on June 20, 2022

Comments

  • Admin
    Admin almost 2 years

    I'm trying to code my current app in Kotlin, but I get null cannot be casted to non-null type. I've tried a lot of different stuff, but I keep getting the same problem. Not sure what to do. Any help would be appreciated!

    Code:

    class MapsActivity : AppCompatActivity(), OnMapReadyCallback {
    
    private lateinit var mMap: GoogleMap
    private lateinit var button: Button
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_maps)
    
        val mapFragment = supportFragmentManager
                .findFragmentById(R.id.mapFragment) as SupportMapFragment
        mapFragment.getMapAsync(this)
    }
    
    override fun onMapReady(googleMap: GoogleMap) {
        mMap = googleMap;
        setUpMap();
    }
    
    fun setUpMap() {
    
        val et = findViewById<EditText>(R.id.editText);
        val et2 = findViewById<EditText>(R.id.editText2);
        val lat = et.getText().toString().toDouble();
        val lng = et2.getText().toString().toDouble();
        //val ll = LatLng(lat, lng)
    
        button = findViewById(R.id.button) as Button
        button.setOnClickListener {
            goToLocation(lat, lng, 11.0f);
        }
    }
    
    fun goToLocation(lat:Double, lng:Double, zoom:Float) {
        val ll = LatLng(lat, lng);
        val update = CameraUpdateFactory.newLatLngZoom(ll, zoom);
        mMap.addMarker(MarkerOptions().position(ll).title("Marquette, Michigan"))
        mMap.moveCamera(update);
    }
    

    XML:

    <LinearLayout 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"
    android:orientation="vertical"
    android:paddingBottom="16dp"
    android:paddingLeft="16dp"
    android:paddingRight="16dp"
    android:paddingTop="16dp"
    tools:layout="@layout/activity_maps">
    
    <EditText
        android:id="@+id/editText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:inputType="textPersonName" />
    
    <EditText
        android:id="@+id/editText2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:inputType="textPersonName" />
    
    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Submit"/>
        <!-- android:onClick="locate"/> -->
    
    <fragment
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:name="com.google.android.gms.maps.SupportMapFragment"
        android:id="@+id/mapFragment"
        />
    

    Logs:

    Caused by: kotlin.TypeCastException: null cannot be cast to non-null type com.google.android.gms.maps.SupportMapFragment at com.example.nrice.mapsproject.MapsActivity.onCreate(MapsActivity.kt:38)

  • Roman
    Roman over 4 years
    this works for me, i am using MapFragment inside Fragment so childFragmentManager do the job well instead of supportFragmentManager, thanks!
  • lasec0203
    lasec0203 about 4 years
    this is the answer you're looking for: stackoverflow.com/a/38405063/2445763; don't use as? if you're not expecting a null value
  • Rezaul Karim
    Rezaul Karim about 3 years
    though it is not the answer related to question. but somebody like me got the exact solution bcoz i am using fragment. thanks. thats why i am voting u.