Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何判断变量是否在kotlin中初始化?_Android_Kotlin - Fatal编程技术网

Android 如何判断变量是否在kotlin中初始化?

Android 如何判断变量是否在kotlin中初始化?,android,kotlin,Android,Kotlin,我在这个应用程序中声明了一个变量,由于某种原因它总是空的。变量位于onClusterItemClick中,它被称为marker(我在变量所在的位置放了一条注释)。我是kotlin的新手,我真的需要一些帮助来找出变量为null的原因。这是我的密码 class MapFragment: BaseFragment<FragmentMapBinding, MapViewModel>(),OnMapReadyCallback, ClusterManager.OnClusterC

我在这个应用程序中声明了一个变量,由于某种原因它总是空的。变量位于
onClusterItemClick
中,它被称为marker(我在变量所在的位置放了一条注释)。我是kotlin的新手,我真的需要一些帮助来找出变量为null的原因。这是我的密码

class MapFragment: BaseFragment<FragmentMapBinding, MapViewModel>(),OnMapReadyCallback,
        ClusterManager.OnClusterClickListener<Station>,ClusterManager.OnClusterItemClickListener<Station>{


    /**
     * Making Map fragment public
     */
    companion object {
        fun newInstance() = MapFragment()
    }


    /**
     * Variables
     */
    @Inject
    lateinit var viewModelFactory: ViewModelProvider.Factory
    private var stationList = mutableListOf<Station>()
    lateinit var mClusterManager: ClusterManager<Station>
    lateinit var mGoogleMaps:GoogleMap
    lateinit var renderer: DefaultClusterRenderer<Station>

    /**
     * Base Fragment methods
     */
    override fun layoutToInflate() = R.layout.fragment_map

    override fun defineViewModel() = ViewModelProviders.of(this, viewModelFactory).get(MapViewModel::class.java)

    override fun doOnCreated() {
        mapView.onCreate(null)
        mapView.onResume()
        mapView.getMapAsync(this)
        viewModel.getStations(activity?.supportFragmentManager!!, R.id.fragment_container, context!!)
        viewModel.retrieveStations().observe(this, Observer<List<Station>> {
            addItems(it)
            mClusterManager?.addItems(stationList)
        })
    }


    /**
     * Google maps methods
     */
    override fun onMapReady(googleMap: GoogleMap) {
        MapsInitializer.initialize(context )
        mGoogleMaps = googleMap
        googleMap.mapType = GoogleMap.MAP_TYPE_NORMAL
        //mGoogleMaps.moveCamera(CameraUpdateFactory.newLatLngZoom(LatLng(51.503186, -0.126446), 10f))
        mClusterManager = ClusterManager(context, mGoogleMaps)
        renderer = StationRenderer(context!!,mGoogleMaps, mClusterManager!!)
        mClusterManager?.setRenderer(StationRenderer(context!!,mGoogleMaps, mClusterManager!!))
        mGoogleMaps.setOnCameraIdleListener(mClusterManager)
        mGoogleMaps.setOnMarkerClickListener(mClusterManager)
        mClusterManager?.setOnClusterClickListener(this)
        mClusterManager?.setOnClusterItemClickListener(this)
    }


    /**
     * Cluster Listeners
     */
    override fun onClusterClick(cluster: Cluster<Station>?): Boolean {
        val builder = LatLngBounds.builder()
        for (item in cluster?.items!!) {
            builder.include(item.position)
        }
        val bounds = builder.build()
        try {
            mGoogleMaps.animateCamera(CameraUpdateFactory.newLatLngBounds(bounds, 100))
        } catch (e: Exception) {
            e.printStackTrace()
        }
        return true
    }


    override fun onClusterItemClick(p0: Station?): Boolean {
        dragView.visibility = View.VISIBLE
        val marker = renderer.getMarker(p0) //marker is always null
        Log.e("CheckIfMarkerIsNull",marker.id) //marker is always null here
        return true
    }


    /**
     * Aux method to populate pin points
     */
    fun addItems(items: List<Station>){
        stationList.addAll(items)
    }


    /**
     * Class to design the pin point into the map
     */

    inner class StationRenderer(context: Context, map: GoogleMap,
                                clusterManager: ClusterManager<Station>) : DefaultClusterRenderer<Station>(context, map, clusterManager) {


        override fun onBeforeClusterRendered(cluster: Cluster<Station>?, markerOptions: MarkerOptions?) {
            markerOptions?.icon(BitmapDescriptorFactory.fromBitmap(createStoreMarker(cluster?.size.toString())))
        }

        override fun onBeforeClusterItemRendered(item: Station?, markerOptions: MarkerOptions?) {
            markerOptions?.icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_map_pin))
        }


        private fun createStoreMarker(stationsCount:String): Bitmap {
            val markerLayout = layoutInflater.inflate(R.layout.marker_item, null)
            val markerImage = markerLayout.findViewById(R.id.marker_image) as ImageView
            val markerRating = markerLayout.findViewById(R.id.marker_text) as TextView
            markerImage.setImageResource(R.drawable.ic_map_pin)
            markerRating.text = stationsCount
            markerLayout.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED))
            markerLayout.layout(0, 0, markerLayout.getMeasuredWidth(), markerLayout.getMeasuredHeight())
            val bitmap = Bitmap.createBitmap(markerLayout.getMeasuredWidth(), markerLayout.getMeasuredHeight(), Bitmap.Config.ARGB_8888)
            val canvas = Canvas(bitmap)
            markerLayout.draw(canvas)
            return bitmap
        }


        override fun shouldRenderAsCluster(cluster: Cluster<Station>?): Boolean {
            return cluster?.size !!> 1
        }


    }

}
class-MapFragment:BaseFragment(),OnMapReadyCallback,
ClusterManager.OnClusterClickListener,ClusterManager.OnClusterItemClickListener{
/**
*公开地图片段
*/
伴星{
fun newInstance()=MapFragment()
}
/**
*变数
*/
@注入
lateinit var viewModelFactory:ViewModelProvider.Factory
private var stationList=mutableListOf()
lateinit var mClusterManager:ClusterManager
lateinit var mGoogleMaps:GoogleMap
lateinit变量渲染器:DefaultClusterRenderer
/**
*碱基片段法
*/
覆盖有趣的layoutToInflate()=R.layout.fragment\u映射
override fun defineViewModel()=ViewModelProviders.of(这是viewModelFactory.get)(MapViewModel::class.java)
覆盖乐趣doOnCreated(){
mapView.onCreate(空)
onResume()文件
getMapAsync(此)
viewModel.getStations(活动?.supportFragmentManager!!,R.id.fragment\u容器,上下文!!)
viewModel.Retrievestions().observe(此,观察者{
附加项(it)
McClusterManager?.addItems(统计列表)
})
}
/**
*谷歌地图方法
*/
在mapready上覆盖乐趣(谷歌地图:谷歌地图){
MapsInitializer.initialize(上下文)
mGoogleMaps=谷歌地图
googleMap.mapType=googleMap.MAP\u类型\u正常
//mGoogleMaps.moveCamera(CameraUpdateFactory.newLatLngZoom(LatLng(51.503186,-0.126446),10f))
mClusterManager=ClusterManager(上下文,mGoogleMaps)
renderer=StationRenderer(context!!,mGoogleMaps,mClusterManager!!)
mClusterManager?.setRenderer(StationRenderer(context!!,mGoogleMaps,mClusterManager!!))
mGoogleMaps.setOnCameraideListener(mClusterManager)
mGoogleMaps.setOnMarkerClickListener(mClusterManager)
McClusterManager?.setOnClusterClickListener(此)
McClusterManager?.setOnClusterItemClickListener(此)
}
/**
*群集侦听器
*/
重写有趣的onClusterClick(集群:集群?):布尔值{
val builder=LatLngBounds.builder()
用于(集群中的项目?.items!!){
建造商。包括(项目。位置)
}
val bounds=builder.build()
试一试{
mGoogleMaps.animateCamera(CameraUpdateFactory.newLatLngBounds(边界,100))
}捕获(e:例外){
e、 printStackTrace()
}
返回真值
}
重写有趣的onClusterItemClick(p0:Station?):布尔值{
dragView.visibility=View.VISIBLE
val marker=renderer.getMarker(p0)//标记始终为空
Log.e(“CheckIfMarkerIsNull”,marker.id)//这里的marker始终为null
返回真值
}
/**
*用于填充接点的辅助方法
*/
趣味附加项(项目:列表){
stationList.addAll(项目)
}
/**
*类将针点设计到地图中
*/
内部类StationRenderer(上下文:context,map:GoogleMap,
clusterManager:clusterManager:DefaultClusterRenderer(上下文、映射、clusterManager){
重写fun onBeforeClusterRendered(群集:群集?,标记选项:标记选项?){
markerOptions?.icon(BitmapDescriptorFactory.fromBitmap(createStoreMarker(cluster?.size.toString()))
}
覆盖fun onBeforeClusterItemRendered(项目:Station?,标记选项:标记选项?){
markerOptions?.icon(BitmapDescriptorFactory.fromResource(R.drawable.ic\u map\u pin))
}
private fun createStoreMarker(StationCount:String):位图{
val markerLayout=LayoutFlater.充气(R.layout.marker_项,空)
val markerImage=markerLayout.findviewbyd(R.id.marker\u image)作为ImageView
val markerRating=markerLayout.findviewbyd(R.id.marker\u text)作为文本视图
markerImage.setImageResource(R.drawable.ic_map_pin)
markerRating.text=站点计数
markerLayout.measure(View.MeasureSpec.MakeMasureSpec(0,View.MeasureSpec.UNSPECIFIED),View.MeasureSpec.MakeMasureSpec(0,View.MeasureSpec.UNSPECIFIED))
布局(0,0,markerLayout.getMeasuredWidth(),markerLayout.getMeasuredHeight())
val bitmap=bitmap.createBitmap(markerLayout.getMeasuredWidth()、markerLayout.getMeasuredHeight()、bitmap.Config.ARGB_8888)
val画布=画布(位图)
markerLayout.draw(画布)
返回位图
}
覆盖fun shouldRenderAsCluster(cluster:cluster?):布尔值{
返回群集?大小!!>1
}
}
}
从中,您可以检查lateinit变量的初始化状态:

if (::variable.isInitialized) { ... }

就你而言:

if (:: renderer.isInitialized) {
    // Do something
}

因为您没有声明变量类型,所以它将假定它可以为null

val标记:类型?=renderer.getMarker(p0)

因此,从技术上讲,它只是使用值
null

看起来您的渲染器没有按您应该的方式使用?在这里稍微编辑一下你的代码

   /**
     * Google maps methods
     */
    override fun onMapReady(googleMap: GoogleMap) {
        MapsInitializer.initialize(context )
        mGoogleMaps = googleMap
        googleMap.mapType = GoogleMap.MAP_TYPE_NORMAL
        //mGoogleMaps.moveCamera(CameraUpdateFactory.newLatLngZoom(LatLng(51.503186, -0.126446), 10f))
        mClusterManager = ClusterManager(context, mGoogleMaps)
        renderer = StationRenderer(context!!,mGoogleMaps, mClusterManager!!)
        mClusterManager?.setRenderer(renderer)
        mGoogleMaps.setOnCameraIdleListener(mClusterManager)
        mGoogleMaps.setOnMarkerClickListener(mClusterManager)
        mClusterManager?.setOnClusterClickListener(this)
        mClusterManager?.setOnClusterItemClickListener(this)
    }

    override fun onClusterItemClick(p0: Station?): Boolean {
        dragView.visibility = View.VISIBLE
        val marker = renderer.getMarker(p0) //marker is always null
        Log.e("CheckIfMarkerIsNull",marker.id) //marker is always null here
        return true
    }

那么为什么它是空的呢/乍一看不确定,但可能是它的
mClusterManager=ClusterManager(context,mGoogleMaps)renderer=StationRenderer(context!!,mGoogleMaps,mClusterManager!!)mClusterManager?.setRenderer(StationRenderer(context!!,mGoogleMaps,mClusterManager!!)
而实际上它应该是
mClusterManager=ClusterManager(context,mGoogleMaps)renderer=StationRenderer(context!!,mGoogleMaps,mClusterManager!!)mClusterManager?.setRenderer(renderer)
My assumptio