android::onClick 的 KotlinNullPointerException

KotlinNullPointerException for android::onClick

我刚开始学习 Kotlin,其中一个按钮有问题。

在 MainActivity 中我有一个按钮,显示带有 EditText 和 Button 的弹出窗口。在该弹出窗口中,用户输入一个城市,变量 CITY 在按下按钮后根据用户输入而变化。

在函数 cityChange 中,我试图用用户在名为 editText 的 EditText 中输入的文本替换我的变量 CITY。但是当用户点击按钮时,我的程序因 NullPointerException 而崩溃。有人可以解释或展示如何解决该问题吗?

异常日志

FATAL EXCEPTION: main
    Process: com.example.weatherapp, PID: 16567
    java.lang.IllegalStateException: Could not execute method for android:onClick
        at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:414)
        at android.view.View.performClick(View.java:7192)
        at android.view.View.performClickInternal(View.java:7166)
        at android.view.View.access00(View.java:824)
        at android.view.View$PerformClick.run(View.java:27592)
        at android.os.Handler.handleCallback(Handler.java:888)
        at android.os.Handler.dispatchMessage(Handler.java:100)
        at android.os.Looper.loop(Looper.java:213)
        at android.app.ActivityThread.main(ActivityThread.java:8178)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1101)
     Caused by: java.lang.reflect.InvocationTargetException
        at java.lang.reflect.Method.invoke(Native Method)
        at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:409)
        at android.view.View.performClick(View.java:7192) 
        at android.view.View.performClickInternal(View.java:7166) 
        at android.view.View.access00(View.java:824) 
        at android.view.View$PerformClick.run(View.java:27592) 
        at android.os.Handler.handleCallback(Handler.java:888) 
        at android.os.Handler.dispatchMessage(Handler.java:100) 
        at android.os.Looper.loop(Looper.java:213) 
        at android.app.ActivityThread.main(ActivityThread.java:8178) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1101) 
     Caused by: kotlin.KotlinNullPointerException
        at com.example.weatherapp.MainActivity.cityChange(MainActivity.kt:48)
        at java.lang.reflect.Method.invoke(Native Method) 
        at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:409) 
        at android.view.View.performClick(View.java:7192) 
        at android.view.View.performClickInternal(View.java:7166) 
        at android.view.View.access00(View.java:824) 
        at android.view.View$PerformClick.run(View.java:27592) 
        at android.os.Handler.handleCallback(Handler.java:888) 
        at android.os.Handler.dispatchMessage(Handler.java:100) 
        at android.os.Looper.loop(Looper.java:213) 
        at android.app.ActivityThread.main(ActivityThread.java:8178) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1101) 
I/Process: Sending signal. PID: 16567 SIG: 9

MainActivity.kt

class MainActivity : AppCompatActivity() {

    var CITY: String = "kyiv, ua"
    val API: String = "7c45088f48678b739d4d8409a2d9d03e"
    private var btn: Button? = null




    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val menuActivity = findViewById<Button>(R.id.activityButton)
        menuActivity.setOnClickListener(){
            val Intent = Intent(this, MenuActivity::class.java)
            startActivity(Intent)
        }

        var dialog = CustomDialogFragment()
        val clkBtn = findViewById<Button>(R.id.cityChange)

        clkBtn.setOnClickListener {
            dialog.show(supportFragmentManager, "customDialog")
        }

    }

    fun cityChange(view: View){
        btn = findViewById(R.id.changingButton)

        btn!!.setOnClickListener{
            CITY = editText.text.toString()
        }
    }

change_city.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="350dp"
    android:layout_height="200dp"
    android:background="@color/colorPrimaryDark"
    android:padding="5dp"
    android:layout_gravity="center">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="City Change"
            android:textStyle="bold"
            android:textColor="@color/white"
            android:layout_gravity="center_horizontal"
            android:layout_marginTop="5dp"/>
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="15dp"
        android:orientation="horizontal">

        <EditText
            android:id="@+id/editText"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:ems="10"
            android:gravity="center"
            android:inputType="textPersonName"
            android:text="" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="225dp"
        android:orientation="vertical">

        <Button
            android:onClick="cityChange"
            android:id="@+id/changingButton"
            android:layout_width="match_parent"
            android:layout_height="62dp"
            android:layout_gravity="bottom"
            android:background="@color/bluelight"
            android:text="Submit" />
    </LinearLayout>

</LinearLayout>

ID 错误

由此

 val clkBtn = findViewById<Button>(R.id.cityChange)

 val clkBtn = findViewById<Button>(R.id.changingButton)

在您的 XML 中,按钮 ID 是“changingButton”而不是“cityChange”

并且不要同时使用onClick和setOnClickListener,只选择一个

就这么简单

// Variable declaration 
 private var btn: Button? = null

 override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val menuActivity = findViewById<Button>(R.id.activityButton)
        menuActivity.setOnClickListener(){
            val Intent = Intent(this, MenuActivity::class.java)
            startActivity(Intent)
        }

        var dialog = CustomDialogFragment()
        btn= findViewById<Button>(R.id.changingButton)

        clkBtn.setOnClickListener {
            dialog.show(supportFragmentManager, "customDialog")
        }

    }

否则你必须改变

这个

  val clkBtn = findViewById<Button>(R.id.cityChange)

 val clkBtn = findViewById<Button>(R.id.changingButton)

希望对您有所帮助。