NullPointerException al intentar acceder a vistas en un fragmento de Kotlin

Resuelto solidak asked hace 54 años • 9 respuestas

¿ Cómo utilizar las extensiones de Android Kotlin con Fragments? Si los uso dentro onCreateView(), obtengo esta NullPointerExceptionexcepción:

Causado por: java.lang.NullPointerException: intento de invocar el método virtual 'android.view.View android.view.View.findViewById(int)' en una referencia de objeto nulo

Aquí está el código del fragmento:

package com.obaied.testrun.Fragment

import android.os.Bundle
import android.support.v4.app.Fragment
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.obaied.acaan.R
import kotlinx.android.synthetic.main.fragment_card_selector.*

public class CardSelectorFragment : Fragment() {
    val TAG = javaClass.canonicalName

    companion object {
        fun newInstance(): CardSelectorFragment {
            return CardSelectorFragment()
        }
    }

    override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        var rootView = inflater?.inflate(R.layout.fragment_card_selector, container, false)
        btn_K.setOnClickListener { Log.d(TAG, "onViewCreated(): hello world"); }

        return rootView
    }
}
`
solidak avatar Jan 01 '70 08:01 solidak
Aceptado

Las propiedades sintéticas de Kotlin no son mágicas y funcionan de una forma muy sencilla. Cuando accedes btn_Kte pide getView().findViewById(R.id.btn_K).

El problema es que estás accediendo demasiado pronto. getView()regresa nullen onCreateView. Intenta hacerlo en el onViewCreatedmétodo:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    btn_K.setOnClickListener { Log.d(TAG, "onViewCreated(): hello world"); }
}
Egor Neliuba avatar Dec 31 '2015 08:12 Egor Neliuba

Está llamando a esto btn_Kdemasiado pronto ya que en ese momento devuelve un valor nulo y le proporciona una excepción de puntero nulo.

Puede utilizar estas vistas mediante este complemento sintético en el onActivityCreated()método que se llama justo después onCreateView()del ciclo de vida del Fragmento.

onActivityCreated()
{
        super.onActivityCreated(savedInstanceState)
        btn_K.setOnClickListener{}
}
Kashish luthra avatar Nov 20 '2017 11:11 Kashish luthra