我正在研究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没有任何经验,因此我感到有些困惑。我尝试过的一些在线解决方案不起作用,所以我在这里提出问题。我的代码有什么问题?
答案 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
。
希望能帮助到你
谢谢