首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >尝试访问Kotlin片段中的视图时的NullPointerException

尝试访问Kotlin片段中的视图时的NullPointerException
EN

Stack Overflow用户
提问于 2015-12-31 13:41:43
回答 9查看 61.3K关注 0票数 262

如何在Fragments中使用Kotlin Android扩展?如果我在onCreateView()中使用它们,我会得到这个NullPointerException异常:

原因: java.lang.NullPointerException:尝试对空对象引用调用虚拟方法“”android.view.View android.view.View.findViewById()“”

以下是片段代码:

代码语言:javascript
复制
package com.obaied.testrun.Fragment

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.obaied.acaan.R
import kotlinx.android.synthetic.main.fragment_card_selector.*

public class CardSelectorFragment : Fragment() {
    val TAG = javaClass.canonicalName

    companion object {
        fun newInstance(): CardSelectorFragment {
            return CardSelectorFragment()
        }
    }

    override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        var rootView = inflater?.inflate(R.layout.fragment_card_selector, container, false)
        btn_K.setOnClickListener { Log.d(TAG, "onViewCreated(): hello world"); }

        return rootView
    }
}
`
EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2015-12-31 16:01:56

Kotlin合成属性不是魔术,它的工作方式非常简单。当你访问btn_K时,它会调用getView().findViewById(R.id.btn_K)

问题是你访问它的速度太快了。getView()onCreateView中返回null。尝试在onViewCreated方法中执行此操作:

代码语言:javascript
复制
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    btn_K.setOnClickListener { Log.d(TAG, "onViewCreated(): hello world"); }
}
票数 485
EN

Stack Overflow用户

发布于 2017-11-20 19:57:09

您调用此btn_K的速度太快了,因为此时它返回一个null,并且给您提供了Null指针异常。

您可以通过在片段生命周期的onCreateView()之后调用的onActivityCreated()方法中的这个合成插件来使用这些视图。

代码语言:javascript
复制
onActivityCreated()
{
        super.onActivityCreated(savedInstanceState)
        btn_K.setOnClickListener{}
}
票数 10
EN

Stack Overflow用户

发布于 2018-08-03 22:03:17

Kotlin Android Extensions plugin生成的合成属性需要事先为Fragment/Activity设置一个view

在您的示例中,对于Fragment,您需要在onViewCreated中使用view.btn_K

代码语言:javascript
复制
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    super.onCreateView(inflater, container, savedInstanceState)
    val view = inflater.inflate(R.layout.fragment_card_selector, container, false)
    view.btn_K.setOnClickListener{} // access with `view`
    return view
}

或者更好,您应该只访问onViewCreated中的合成属性

代码语言:javascript
复制
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    super.onCreateView(inflater, container, savedInstanceState)
    return inflater.inflate(R.layout.fragment_card_selector, container, false)
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    btn_K.setOnClickListener{} // access without `view`
}

请注意,savedInstanceState参数应该是可以为空的Bundle?,同时还要检查Importing synthetic properties

一次性导入特定布局的所有小部件属性非常方便:

import kotlinx.android.synthetic.main.<layout>.*

因此,如果布局文件名为activity_main.xml,我们将导入kotlinx.android.synthetic.main.activity_main.*.

如果我们想在视图上调用合成属性,我们还应该导入kotlinx.android.synthetic.main.activity_main.view.*.

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34541650

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档