Я знаю, что раньше задавали много подобных вопросов, но обычно они написаны на 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
Я просто хочу перейти к другому действию, нажав кнопку.
ваш next1 us null, вам нужно инициализировать его перед вызовом NumberVerButton()
Ваша переменная next1 никогда не объявляется и не инициализируется. Я надеюсь, что это где-то объявлено, иначе код должен был получить ошибку компиляции.
Следовательно, мое наблюдение состоит в том, что переменная 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))
}
}
}
Надеюсь, это поможет.
Большое вам спасибо за вашу помощь. Однако теперь у меня есть 2 синтаксические ошибки. Во-первых: next1 = findViewById(R.id.Button) as Button (кнопка в R.id.Button красная) и 2. next1.setOnClickListener { (точка между ними красная, и это говорит мне, что я могу заменить ее на ?. или !!
На самом деле я хотел написать пример кода. Это может иметь некоторую синтаксическую ошибку, о которой, я думаю, можно позаботиться самостоятельно.
Я попытался удалить синтаксические ошибки и, пожалуйста, проверьте обновленный код сейчас. Спасибо.
Ну, во-первых, вам нужен объект для ссылки, глядя на ваш исходный код, вы используете объект 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 для каждого объекта
<?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>
Ну, в основном вам нужно прикрепить любые объекты макета пользовательского интерфейса к исходному коду, чтобы управлять ими, если вы не создадите экземпляры своих объектов правильно, у вас будет исключение NullPointer Exception, потому что ваш исходный код попытается сослаться на ваш объект next1, но это никогда не было объявлены и не созданы.
КОММЕНТАРИЙ: Честно говоря, если вам нужны хорошие практики, вам следует подумать о разработке на Java и продолжать использовать Kotlin, пока вы действительно не освоите его. в какой-то момент всем старым разработчикам, таким как я, нам нужно перейти на kotlin, но пока, по крайней мере, я не знаю никого, кто мог бы без проблем реплицировать весь старый исходный код на kotlin.
Спасибо, это очень помогло!
Возможный дубликат Что такое исключение NullPointerException и как его исправить?