提问人:S K 提问时间:7/19/2019 最后编辑:S K 更新时间:7/20/2019 访问量:3215
(android.view.View$OnClickListener)' 在空对象引用 Kotlin 上
(android.view.View$OnClickListener)' on a null object reference Kotlin
问:
我知道以前有很多类似的问题被问过,但通常,它们是用 Java 编写的。我遵循了多个教程,但每次都出现相同的错误。我遵循了本教程,它适用于其他脚本。
尝试了这个答案,但效果不佳。
这个问题是独一无二的,因为其他问题都是用 java 编写的,这对我来说并不容易。
这是我的:MainActivity
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
NumberVerButton()
}
private fun NumberVerButton() {
next1.setOnClickListener {
startActivity(Intent(this, NumberVer::class.java))
}
}
}
错误如下。
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.wyspiansky, PID: 20258
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.wyspiansky/com.example.wyspiansky.NumberVer}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
我只想通过单击按钮移动到另一个活动。
答:
2赞
Reaz Murshed
7/19/2019
#1
您的变量永远不会被声明或初始化。我希望这是在某个地方声明的,否则,代码应该有编译错误。next1
因此,我的观察是变量未初始化。您需要将 声明为按钮,然后使用方法初始化变量,以使用布局中的特定视图引用 ID 标记此按钮。next1
next1
next1
findViewById
class MainActivity : AppCompatActivity() {
var next1: Button? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
next1 = findViewById(R.id.button) as Button
NumberVerButton()
}
private fun NumberVerButton() {
next1?.setOnClickListener {
startActivity(Intent(this, MainActivity::class.java))
}
}
}
希望能有所帮助。
评论
0赞
S K
7/19/2019
非常感谢您的帮助。但是,现在我有 2 个语法错误。首先:next1 = findViewById(R.id.Button) as Button(R.id.Button 中的 Button 为红色)和 2.next1.setOnClickListener { (点之间是红色的,它告诉我我可以用 ?. 或 !!
0赞
Reaz Murshed
7/19/2019
我实际上想写一个示例代码。这可能有一些语法错误,我认为可以自己处理。
0赞
Reaz Murshed
7/19/2019
我试图删除语法错误,请立即检查更新的代码。谢谢。
-1赞
toddsalpen
7/19/2019
#2
首先,你需要一个对象来引用,看看你的源代码,你正在使用next1对象,该对象在源代码中没有任何位置声明。还有谁知道通常是什么类型的物体
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.TextView
class MainActivity : AppCompatActivity() {
//First you prepare your objects to use them
private var text1: TextView? = null
private var next1: Button? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//here you assign your references
//between the Layout xml file and your objects
text1 = findViewById(R.id.textView1)
next1 = findViewById(R.id.button1)
//here you set the click listener to your object
// remember, it need to be a View object, in this case
// is a Button which button heirs all from the parent class View
next1!!.setOnClickListener{
text1!!.text = "Hello S K, your click listener Works"
}
}
}
此外,您需要在每个对象的 android:id xml 属性中具有相同 id 名称的布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"/>
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
好吧,基本上你需要将任何你的 UI 布局对象附加到你的源代码中才能控制它们,如果你没有正确实例化你的对象,你将有 NullPointer 异常,因为你的源代码将尝试引用你的 next1 对象,但它从未被声明,也没有被实例化。
评论:老实说,如果你想要好的实践,你应该考虑用 Java 进行开发并继续使用 Kotlin,直到你真正掌握它。在某种程度上,所有像我这样的老开发人员都需要将 Witch 迁移到 Kotlin,但至少现在我不知道有人可以毫无问题地将所有旧源代码复制到 Kotlin。
评论
0赞
S K
7/20/2019
谢谢你,它帮了大忙!
评论
next1
NumberVerButton()