(android.view.View$OnClickListener)' в ссылке на нулевой объект 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

Я просто хочу перейти к другому действию, нажав кнопку.

Возможный дубликат Что такое исключение NullPointerException и как его исправить?

Tamir Abutbul 19.07.2019 17:21

ваш next1 us null, вам нужно инициализировать его перед вызовом NumberVerButton()

Tamir Abutbul 19.07.2019 17:21
0
2
2 327
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Ваша переменная 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 { (точка между ними красная, и это говорит мне, что я могу заменить ее на ?. или !!

S K 19.07.2019 17:35

На самом деле я хотел написать пример кода. Это может иметь некоторую синтаксическую ошибку, о которой, я думаю, можно позаботиться самостоятельно.

Reaz Murshed 19.07.2019 17:37

Я попытался удалить синтаксические ошибки и, пожалуйста, проверьте обновленный код сейчас. Спасибо.

Reaz Murshed 19.07.2019 17:45

Ну, во-первых, вам нужен объект для ссылки, глядя на ваш исходный код, вы используете объект 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.

Спасибо, это очень помогло!

S K 19.07.2019 18:53

Другие вопросы по теме