Возникли проблемы при перемещении из фрагмента фрагмента /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.......
- Измените класс XML на SupportMapFragment в стороне фрагмента
- Измените так, чтобы SupportMapFragment обнулялся во всем вашем коде
- Измените supportFragmentManager на childFragmentManager..supportFragmentManager также будет работать, однако он не будет запускать onMapReady...
- Улыбнись, потому что ты избил 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)
что не рекомендуется из-за нулевых исключений.