kotlin.TypeCastException: ноль не может быть приведен к ошибке не нулевого типа - PullRequest
0 голосов
/ 27 июня 2018

Я пытаюсь получить информационное окно, работающее с Google Maps API. При попытке запустить приложение и при добавлении маркера с пользовательским информационным блоком происходит сбой. Вот мой код:

класс MainMapsActivity: AppCompatActivity (), OnMapReadyCallback {

private lateinit var mMap: GoogleMap
private val test: ArrayList<String> = arrayListOf()

private var mLocationPermissionGranted: Boolean = false
private val PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION: Int = 1234
// ^Number isnt definitive, as long as its unique inside the application
private val DEFAULT_ZOOM: Float = 15.0F

private var mLastKnownLocation: Location? = null

private val mDefaultLocation = LatLng(60.312491, 24.484248)

private lateinit var mFusedLocationProviderClient: FusedLocationProviderClient





override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main_maps)


    // Obtain the SupportMapFragment and get notified when the map is ready to be used.
    val mapFragment = supportFragmentManager
            .findFragmentById(R.id.map) as SupportMapFragment
    mapFragment.getMapAsync(this)

    mFusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this)
}


override fun onMapReady(googleMap: GoogleMap) {
    mMap = googleMap

    getDeviceLocation()

    //PRESSING WILL ADD MARKER
    mMap.setOnMapClickListener(GoogleMap.OnMapClickListener { point ->
        val builder: AlertDialog.Builder
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            builder = AlertDialog.Builder(this, android.R.style.Theme_Material_Dialog_Alert)
        } else {
            builder = AlertDialog.Builder(this)
        }
        val marker = MarkerOptions().position(point)
        builder.setTitle("Are you sure you want to add a map location here?")
                .setMessage("Are you sure you want to add a map location here?")
                .setPositiveButton(android.R.string.yes, DialogInterface.OnClickListener { dialog, which ->
                    mMap.addMarker(marker)
                            //CUSTOM MARKER
                            .setIcon(BitmapDescriptorFactory.fromResource(R.mipmap.pinetree_foreground))
                })

                .setNegativeButton(android.R.string.no, DialogInterface.OnClickListener { dialog, which ->
                    // do nothing
                })
                .show()

        true
       val mapInfoWindowFragment = supportFragmentManager.findFragmentById(R.id.infoWindowMap) as MapInfoWindowFragment

        //Set Custom InfoWindow
         val infoWindow = InfoWindow(point, InfoWindow.MarkerSpecification(0, 0), mapInfoWindowFragment)
        // Shows the InfoWindow or hides it if it is already opened.
        mapInfoWindowFragment.infoWindowManager()?.toggle(infoWindow, true);


    })

И вот ошибка, которую Logcat дает мне:

kotlin.TypeCastException: null cannot be cast to non-null type com.example.sampo.luontoalueet.MapInfoWindowFragment
    at com.example.sampo.luontoalueet.MainMapsActivity$onMapReady$1.onMapClick(MainMapsActivity.kt:123)

У меня вопрос, как изменить это утверждение на ненулевой тип?

val mapInfoWindowFragment = supportFragmentManager.findFragmentById(R.id.infoWindowMap) as MapInfoWindowFragment

1 Ответ

0 голосов
/ 27 июня 2018

Ваш findfragmentById возвращает null (что указывает на то, что ваш фрагмент не существует).

Если вы абсолютно уверены, что фрагмент не может быть null на данный момент, вам нужно пересмотреть свой код. Может быть, ваш фрагмент не прикреплен к supportFragmentManager?

Если вы хотите обработать случай, когда этот фрагмент может не существовать, вы можете использовать nullable cast as?:

val mapInfoWindowFragment = supportFragmentManager.findFragmentById(R.id.infoWindowMap) as? MapInfoWindowFragment

Тогда вы можете проверить условно if(mapInfoWindowFragment == null) и обработать нулевой регистр.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...