2017-10-14 58 views
-2

的问题所以我能够使用MapFragment没有问题,但是当我将其更改为supportMapFragment时,它会保留。与下面的错误。不知道我在做什么错,一个工程,另一个没有。我需要一个支持的原因是,我不能删除片段与使用mapfragment,因为下面的行是expectin片段!并且正在接收MapFragment .....所以它失败了...当我将它切换到SupportMapFragment时,下面的代码行可行,但是错误发生在下面。从fragmentManager/MapFragment移动到supportfragmentManager/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" /> 

CLASS

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 
    } 

错误

n时间:致命异常:主 工艺: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:1419)

SOLUTION

所以...溶液呈两倍....

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

  1. 将XML类更改为SupportMapFragment中的一个片段
  2. 变化使SupportMapFragment是整个代码
  3. 变化supportFragmentManager到childFragmentManager..supportFragmentManager一个可空还将工作,但它不会触发onMapReady ...
  4. 微笑,因为你拍下来科特林/ Android的像一个小.. ...;)
+0

某些“答案不完整......在此处发布完整答案... – BostonMacOSX

+0

您可以发布完整答案并接受它。请参阅[此处](https://stackoverflow.com/help/self -answer) – BakaWaii

回答

0

在kotlin可空类(with?在类类型的末尾)是不同于不可空的类。 findFragmentById可以返回null,因此返回类型为空。您正尝试投入不可空的SupportMapFragment

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

+0

MapFragment不为null,因此supportMapFragment也不应该为空...... – BostonMacOSX

+0

这是通过id找到的文档'@return如果找到了fragment,否则返回null“。这不是关于它* *是** null或不是,但aboutt **可以是**。我已经更新了答案,以便更清楚。 –

0

因为你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) 
不推荐由于NullPointerExceptions的

强制空值。

+0

虽然... mapFragment不为空,所以supportMapFragment shouldn' t也为空... – BostonMacOSX

+0

看到上面的解决方案...所需的childfragmentmanager ...那么它现在似乎工作... – BostonMacOSX