'KotlinNullPointerException for android::onClick
I`m just started learning Kotlin, and i have a problem with one of the buttons.
In MainActivity i have a button, that shows a popup with EditText and Button. In that popup user enters a city, and variable CITY changes according to user input after pressing a button.
In function cityChange im trying to replace my variable CITY with a text that user enters in EditText named editText. But when user taps on button, my program crashes with a NullPointerException. Can someone explain, or show how to fix that problem?
Exception log
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.access$3500(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.access$3500(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.access$3500(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>
Solution 1:[1]
Just simply do this
// 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")
}
}
Or Else You have to Change
This
val clkBtn = findViewById<Button>(R.id.cityChange)
To
val clkBtn = findViewById<Button>(R.id.changingButton)
Hope this will helpful to you.
Solution 2:[2]
wrong ID
from this
val clkBtn = findViewById<Button>(R.id.cityChange)
to
val clkBtn = findViewById<Button>(R.id.changingButton)
in your XML the button id is "changingButton" not "cityChange"
and don't use onClick and setOnClickListener together, just choose one
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Bhavin Solanki |
| Solution 2 | Jalalkun |
