mrt
mrt

Reputation: 1

NullPointerException in my android Activity

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

Answers (4)

prakash joshi
prakash joshi

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

Tenfour04
Tenfour04

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:

  1. Wrap each findViewById call in by lazy { } so it won't be initialized before onCreate(). For example:
val button0: Button by lazy { findViewById(R.id.button0) }
  1. Make them 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()
}
  1. Use view binding. This is recommended, especially when you have so many view properties. It will save you a bunch of repetitious code and will be less prone to error.

Upvotes: 2

Halil Ozel
Halil Ozel

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

Danh Nguyen
Danh Nguyen

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

Related Questions