如何将onClickListener设置为kotlin中的按钮[重复]

Posted

技术标签:

【中文标题】如何将onClickListener设置为kotlin中的按钮[重复]【英文标题】:How to set an onClickListener to a button in kotlin [duplicate] 【发布时间】:2019-11-07 00:30:59 【问题描述】:

我正在开发一个混合了 kotlin 和 java 的 android studio 项目。我正在尝试将 onClickListener 设置为按钮,但是我一直遇到如下编译时错误:

java.lang.RuntimeException: Unable to start activity 
ComponentInfocom.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 经验,所以我觉得这有点令人困惑。我尝试过的一些在线解决方案不起作用,所以我在这里问这个问题。我的代码有什么问题?

【问题讨论】:

您缺少setContentView 【参考方案1】:

这个错误

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

说你的activity没有正确加载,你有这种情况吗?

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

一旦你设置了内容视图,你就可以像以前一样使用你的 setOnClickListener。

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

【讨论】:

如果有人反对,请添加原因:) 这行得通,这行代码: setContentView(R.layout.folio_activity) 在 onCreate 方法中有点下方。我刚刚把你的代码放在它下面,它就可以工作了。 @Skizo-ozᴉʞS 否决票的原因:上下文与他的错误无关。 setContentView(R.layout.folio_activity) 有问题,最好使用 Toast.LENGTH_LONG 而不导入另一个包。 @Ashish 我已经编辑了问题,我删除了上下文内容,现在是一个不错的答案,请随时删除不赞成票 ;) @Skizo-ozᴉʞS 完成【参考方案2】:

在 Kotlin 中,您不需要 findViewById

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

kotlin-synthetic 的帮助下应该可以正常工作,如果仍然有错误,那么您应该查看 ID 并确保它们匹配

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

apply plugin: 'kotlin-android-extensions'

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

【讨论】:

这也很好,但并没有真正回答这个问题,它就像一个“提示”,无论如何解释得很好 这也有效,但并不能真正解决问题。将采取提示并删除 findViewByID() 方法。 发布你的activity_main.xml【参考方案3】:
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 为空,原因可能是您缺少 Activity 的 XML 文件中的按钮,或者您引用了错误的元素。

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

【讨论】:

如果他从 findviewbyid 中删除 var 是不是可能的?并为他的活动提供 ContentView 布局名称? 是的,您可以删除 var 并在 findViewById

以上是关于如何将onClickListener设置为kotlin中的按钮[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Android:将 onClickListener 设置为 TextView 中的部分文本 - 问题

如何在 Android 应用程序中为联系我们表单设置 onClickListener

如何在Android中再次设置布尔值true?

如何在 ArrayAdapter 上设置 onClickListener?

如何在 Android 中的 RadioButton 上设置 OnClickListener?

如何正确的给ViewGroup设置OnClickListener