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

我正在开发一个混合了 kotlin 和 java 的 android studio 项目。我正在尝试将 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 经验,所以我觉得这有点令人困惑。我尝试过的一些在线解决方案不起作用,所以我在这里问这个问题。我的代码有什么问题?

【问题讨论】:

  • 您缺少setContentView

标签: android kotlin


【解决方案1】:

这个错误

java.lang.RuntimeException:无法启动活动 ComponentInfo{com.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
猜你喜欢
  • 2015-02-18
  • 1970-01-01
  • 2018-01-10
  • 2019-05-06
  • 2012-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多