【问题标题】:Having issues moving from fragmentManager/MapFragment to supportfragmentManager/SupportMapFragment从 fragmentManager/MapFragment 移动到 supportfragmentManager/SupportMapFragment 时遇到问题
【发布时间】:2017-10-14 12:28:53
【问题描述】:

所以我可以毫无问题地使用 MapFragment,但是当我将其更改为 supportMapFragment 时,它就会退出。出现以下错误。不知道我做错了什么,一个有效,另一个无效。我需要支持的原因是在使用 ma​​pfragment 时我无法删除片段,因为下面的行是片段!并且正在接收 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:null 不能转换为非 null 类型 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:1419)

解决方案

所以......解决方案有两个......

当从 MapFragment 更改为 SupportMapFragment.......

  1. 将 XML 类更改为片段一侧的 SupportMapFragment
  2. 更改以使 SupportMapFragment 在整个代码中都可以为空
  3. 将 supportFragmentManager 更改为 childFragmentManager..supportFragmentManager 也将起作用,但它不会触发 onMapReady...
  4. 微笑,因为你打败了 Kotlin/Android 有点像..... ;)

【问题讨论】:

  • 一些“答案不完整....在这里发布了完整的答案...
  • 您可以发布您的完整答案并接受它。参考here

标签: android google-maps kotlin supportmapfragment mapfragment


【解决方案1】:

由于您的 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,不能为空。

最后但并非最不重要的是通过使用强制一个可为空的值

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

由于 nullpointerexceptions 不建议这样做。

【讨论】:

  • Is 不应该为空...... mapFragment 不为空......所以 supportMapFragment 也不应该为空......
  • 参见上面的解决方案...需要 childfragmentmanager...然后它现在似乎可以工作...
【解决方案2】:

在 kotlin 中,可为空的类(在类类型末尾带有 ?)与不可为空的类不同。 findFragmentById 可以返回 null,因此返回类型可以为 null。您正在尝试转换为不可为空的 SupportMapFragment

尝试这样做activity.supportFragmentManager.findFragmentById(R.id.mapF) as SupportMapFragment?

【讨论】:

  • MapFragment 不为空,因此 supportMapFragment 也不应该为空...
  • 这是由 id doc @return The fragment if found or null otherwise. 找到的,这与它无关 is 是否为空,而是关于 可以是。我已经更新了答案以更清楚。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-12
  • 1970-01-01
  • 2019-04-16
  • 2019-12-30
  • 2011-01-16
相关资源
最近更新 更多