Reputation: 1
I'm new in android and I get this error I can't resolve. Is part of the code for a calculator app and I'm stuck on it. It gives me a null pointer exception and I don't had trouble with it before I created the listeners and the view variables.
My code program is this:
package com.example.calculadora
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.text.Editable
import android.widget.Button
import android.widget.EditText
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
detectarEntrada()
}
val button0 = findViewById<Button>(R.id.button0)
val button1 = findViewById<Button>(R.id.button1)
val button2 = findViewById<Button>(R.id.button2)
val button3 = findViewById<Button>(R.id.button3)
val button4 = findViewById<Button>(R.id.button4)
val button5 = findViewById<Button>(R.id.button5)
val button6 = findViewById<Button>(R.id.button6)
val button7 = findViewById<Button>(R.id.button7)
val button8 = findViewById<Button>(R.id.button8)
val button9 = findViewById<Button>(R.id.button9)
val button_equal = findViewById<Button>(R.id.button_equal)
val button_par_ab = findViewById<Button>(R.id.button_par_ab)
val button_par_cl = findViewById<Button>(R.id.button_par_cl)
val button_coma = findViewById<Button>(R.id.button_coma)
val buttonAC = findViewById<Button>(R.id.buttonAC)
val button_mul = findViewById<Button>(R.id.button_por)
val button_div = findViewById<Button>(R.id.button_div)
val button_sum = findViewById<Button>(R.id.button_sum)
val button_dif = findViewById<Button>(R.id.button_dif)
val caja = findViewById<EditText>(R.id.caja_de_texto)
public fun imprimir(simbolo: String) {
var texto = caja.text.toString()
var texto_a_poner = texto + simbolo
caja.text = Editable.Factory.getInstance().newEditable(texto_a_poner)
}
public fun detectarEntrada() {
button0.setOnClickListener { imprimir("0") }
button1.setOnClickListener { imprimir("1") }
button2.setOnClickListener { imprimir("2") }
button3.setOnClickListener { imprimir("3") }
button4.setOnClickListener { imprimir("4") }
button5.setOnClickListener { imprimir("5") }
button6.setOnClickListener { imprimir("6") }
button7.setOnClickListener { imprimir("7") }
button8.setOnClickListener { imprimir("8") }
button9.setOnClickListener { imprimir("9") }
button_par_ab.setOnClickListener { imprimir("(") }
button_par_cl.setOnClickListener { imprimir(")") }
button_coma.setOnClickListener { imprimir(",") }
button_mul.setOnClickListener { imprimir("*") }
button_div.setOnClickListener { imprimir("/") }
button_sum.setOnClickListener { imprimir("+") }
button_dif.setOnClickListener { imprimir("-") }
buttonAC.setOnClickListener {
caja.text = Editable.Factory.getInstance().newEditable("0")
}
}
}
Hope someone could help me
I searched in the web for similar problems and for this error especially. But I don't know how I could fix it.
Upvotes: 0
Views: 416
Reputation: 13
you must require to call findViewById in OnCreate Method.
and Google is Recommanded to use ViewBinding so it will save lots of time and Reduce Code make it clean architecture Pattenr.
Only Single Steps for Implementing View Binding
buildFeatures {
viewBinding = true
}
after Integration Please do coding like below in your activity
private lateinit var binding: ResultProfileBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ResultProfileBinding.inflate(layoutInflater)
val view = binding.root
setContentView(view)
binding.button.setOnClickListener { yourLogic() }
}
Upvotes: 0
Reputation: 93834
All property initializers are called before onCreate()
, even if you declare them below onCreate()
. Before onCreate()
, you haven't called setContentView()
yet, so there is no view to find. So it throws NullPointerException.
Three ways to fix this:
findViewById
call in by lazy { }
so it won't be initialized before onCreate()
. For example:val button0: Button by lazy { findViewById(R.id.button0) }
lateinit
properties and move the initialization inside onCreate()
. For example:lateinit val button0: Button
//...
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
button0 = findViewById(R.id.button0)
//...
detectarEntrada()
}
Upvotes: 2
Reputation: 3332
Firstly, You must call the method findViewById()
inside method onCreate()
and after setContentView
.
For more detail: https://developer.android.com/reference/android/app/Activity
package com.example.calculadora
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.text.Editable
import android.widget.Button
import android.widget.EditText
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val button0 = findViewById<Button>(R.id.button0)
val button1 = findViewById<Button>(R.id.button1)
val button2 = findViewById<Button>(R.id.button2)
val button3 = findViewById<Button>(R.id.button3)
val button4 = findViewById<Button>(R.id.button4)
val button5 = findViewById<Button>(R.id.button5)
val button6 = findViewById<Button>(R.id.button6)
val button7 = findViewById<Button>(R.id.button7)
val button8 = findViewById<Button>(R.id.button8)
val button9 = findViewById<Button>(R.id.button9)
val button_equal = findViewById<Button>(R.id.button_equal)
val button_par_ab = findViewById<Button>(R.id.button_par_ab)
val button_par_cl = findViewById<Button>(R.id.button_par_cl)
val button_coma = findViewById<Button>(R.id.button_coma)
val buttonAC = findViewById<Button>(R.id.buttonAC)
val button_mul = findViewById<Button>(R.id.button_por)
val button_div = findViewById<Button>(R.id.button_div)
val button_sum = findViewById<Button>(R.id.button_sum)
val button_dif = findViewById<Button>(R.id.button_dif)
val caja = findViewById<EditText>(R.id.caja_de_texto)
detectarEntrada()
}
public fun imprimir(simbolo: String) {
var texto = caja.text.toString()
var texto_a_poner = texto + simbolo
caja.text = Editable.Factory.getInstance().newEditable(texto_a_poner)
}
public fun detectarEntrada() {
button0.setOnClickListener { imprimir("0") }
button1.setOnClickListener { imprimir("1") }
button2.setOnClickListener { imprimir("2") }
button3.setOnClickListener { imprimir("3") }
button4.setOnClickListener { imprimir("4") }
button5.setOnClickListener { imprimir("5") }
button6.setOnClickListener { imprimir("6") }
button7.setOnClickListener { imprimir("7") }
button8.setOnClickListener { imprimir("8") }
button9.setOnClickListener { imprimir("9") }
button_par_ab.setOnClickListener { imprimir("(") }
button_par_cl.setOnClickListener { imprimir(")") }
button_coma.setOnClickListener { imprimir(",") }
button_mul.setOnClickListener { imprimir("*") }
button_div.setOnClickListener { imprimir("/") }
button_sum.setOnClickListener { imprimir("+") }
button_dif.setOnClickListener { imprimir("-") }
buttonAC.setOnClickListener {
caja.text = Editable.Factory.getInstance().newEditable("0")
}
}
}
You can use View Binding to make your code more readable.
https://www.google.com/search?client=safari&rls=en&q=viewbinding&ie=UTF-8&oe=UTF-8
Upvotes: 0
Reputation: 125
You should call the method findViewById()
inside the life cycle method onCreate()
and after setContentView
.
Also, you can use ViewBind and you can write simple code like
binding. button0.setOnClickListener { imprimir("0") }
Hope it helps you.
Upvotes: 1