Возникли проблемы при перемещении из фрагмента фрагмента /MapFragment в supportfragmentManager/SupportMapFragment

Так что я могу использовать MapFragment без проблем, но когда я изменяю его на supportMapFragment, он выручает. с ошибкой ниже не уверен, что я делаю неправильно, что один работает, а другой нет. Причина, по которой мне нужна поддержка, заключается в том, что я не могу удалить фрагмент с помощью mapfragment, потому что строка ниже ожидает фрагмент! и получает MapFragment..... таким образом, он терпит неудачу... когда я переключаю его на SupportMapFragment, строка ниже работает, но ошибки происходят ниже.

Спасибо

    getFragmentManager().beginTransaction().remove(mapFragment).commit();

XML

 <fragment
            android:id="@+id/mapF"
            class="com.google.android.gms.maps.SupportMapFragment"
            android:layout_width="match_parent"
            android:layout_height="200dp" />

УЧЕБНЫЙ КЛАСС

import android.location.Address
import android.os.Bundle
import android.support.v4.app.Fragment
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.google.android.gms.maps.*
import com.google.android.gms.maps.model.LatLng
import com.google.android.gms.maps.model.MarkerOptions
import android.location.Geocoder
import android.text.Html
import android.webkit.WebView
import android.widget.Toast
import com.beust.klaxon.JsonObject
import com.beust.klaxon.Parser
import com.beust.klaxon.obj
import com.beust.klaxon.string
import com.github.kittinunf.fuel.httpGet
import com.github.kittinunf.fuel.httpPost
import com.github.kittinunf.result.Result
import com.github.kittinunf.result.getAs
import kotlinx.android.synthetic.main.fragment_1.view.*
import kotlinx.android.synthetic.main.fragment_event_details.*
import kotlinx.android.synthetic.main.fragment_event_details.view.*
import java.util.*
import kotlin.collections.ArrayList



class Event_details : Fragment(),OnMapReadyCallback{
    lateinit var mMap:GoogleMap
    lateinit var mWeb:WebView
    lateinit var mapFragment:SupportMapFragment

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)


    }



    override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?,
                              savedInstanceState: Bundle?): View? {
        var myView = inflater!!.inflate(R.layout.fragment_event_details, container, false)

        var mP = Pair("news_id",101)
        var mL:ArrayList<Pair<String,Int>> = ArrayList<Pair<String,Int>>()
        mL.add(mP)


       ****do some JSON STUFF****


        >>>>> LINNE 125   mapFragment = activity.supportFragmentManager.findFragmentById(R.id.mapF) as SupportMapFragment
        mapFragment.getMapAsync(this) 



        return  myView
    }

ОШИБКА

ntime: ИСКЛЮЧИТЕЛЬНОЕ ИСКЛЮЧЕНИЕ: основной Процесс: com.example.herbstzu.listview, PID: 11988 kotlin.TypeCastException: нельзя преобразовать нуль в ненулевой тип com.google.android.gms.maps.SupportMapFragment в com.example.sadfasdf.listview.Event_details.onCreateView(Event_details.kt:125) в android.support.v4.app.Fragment.performCreateView(Fragment.java:2354) в android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:14)

РЕШЕНИЕ

Итак... решение было в два раза....

При переходе с MapFragment на SupportMapFragment.......

  1. Измените класс XML на SupportMapFragment в стороне фрагмента
  2. Измените так, чтобы SupportMapFragment обнулялся во всем вашем коде
  3. Измените supportFragmentManager на childFragmentManager..supportFragmentManager также будет работать, однако он не будет запускать onMapReady...
  4. Улыбнись, потому что ты избил Kotlin/Android как маленький.....;)

2 ответа

В kotlin обнуляемый класс (с? В конце типа класса) отличается от класса, не обнуляемого. findFragmentById может возвращать ноль, поэтому возвращаемый тип имеет значение null Вы пытаетесь бросить в необнуляемый SupportMapFragment,

Попробуйте сделать это так activity.supportFragmentManager.findFragmentById(R.id.mapF) as SupportMapFragment?

Так как ваш SupportFragment может быть нулевым, вам нужно выполнить проверку на ноль. Есть несколько способов сделать это. Самое простое

activity.supportFragmentManager.findFragmentById(R.id.mapF)
(mapFragment as SupportFragment)?.getMapAsync(this) 

Это будет игнорировать все после? если значение равно нулю.

С помощью

activity.supportFragmentManager.findFragmentById(R.id.mapF)?.let {
    (it as SupportFragment).getMapAsync(this)
}  

работает так же, за исключением того, что все в it ваш SupportFragment, который не может быть нулевым.

И последнее, но не менее важное: принудительно установить значение NULL, используя

activity.supportFragmentManager.findFragmentById(R.id.mapF)
(mapFragment as YourFragment).!!getMapAsync(this) 

что не рекомендуется из-за нулевых исключений.

Другие вопросы по тегам