如何将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
如何在 ArrayAdapter 上设置 onClickListener?