如何在Kotlin中将onClickListener设置为按钮

时间:2019-06-25 08:03:43

标签: android kotlin

我正在研究android studio项目,该项目是kotlin和Java的混合体。我试图将onClickListener设置为按钮,但是我一直遇到如下编译时错误:

java.lang.RuntimeException: Unable to start activity 
ComponentInfo{com.folioreader.android.sample/com.folioreader.ui.activity.FolioActivity}:

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference

这是我的代码:

 private var buttonBookmarks: Button? = null

 //these two are in onCreate
 var buttonBookmarks = findViewById<Button>(R.id.btn_bookmarks)

 buttonBookmarks.setOnClickListener {
        Toast.makeText(this, "Works", LENGTH_LONG).show()
    }

我知道这是一个简单的问题,但是,在开始从事此工作之前,我对Kotlin没有任何经验,因此我感到有些困惑。我尝试过的一些在线解决方案不起作用,所以我在这里提出问题。我的代码有什么问题?

3 个答案:

答案 0 :(得分:2)

在Kotlin中,您不需要findViewById

btn_bookmarks.setOnClickListener {
        Toast.makeText(this, "Works", LENGTH_LONG).show()
    }

如果仍然有错误,应借助kotlin-synthetic正常工作,然后应查看ID并确保它们匹配

注意:要使用kotlin-synthetic,您应该应用如下插件

apply plugin: 'kotlin-android-extensions'

有关扩展名的更多信息,请访问here

答案 1 :(得分:0)

那是因为这里有this,所以您应该这样做onClickListener

buttonBookmarks.setOnClickListener({ v -> 
  Toast.makeText(v.getContext(), "Works", Toast.LENGTH_LONG).show() 
})

另一种替代方法是创建一个var mContext : Context,然后在onCreate()中分配它,或者执行mContext = this,然后使用this代替mContext应该可以。

也是这个错误

  

java.lang.RuntimeException:无法启动活动   ComponentInfo {com.folioreader.android.sample / com.folioreader.ui.activity.FolioActivity}:

说您的活动未正确加载,您是否有类似的东西?

class FolioActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.folio_activity) <-- this one
    }
}

答案 2 :(得分:0)

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        private var buttonBookmarks: Button? = null

        //these two are in onCreate
        var buttonBookmarks = findViewById<Button>(R.id.btn_bookmarks)

        buttonBookmarks.setOnClickListener {
            Toast.makeText(this, "Works", LENGTH_LONG).show()
        }
    }
}

我刚刚尝试了您的代码。它运作完美。您的语法似乎正确,通过看到错误

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference

唯一的问题是您的buttonBookmarks为空,原因可能是您缺少活动XML文件中的按钮,或者您引用了错误的元素。

  • 评论private var buttonBookmarks: Button? = null。 希望能帮助到你 谢谢