NullPointerException al intentar acceder a vistas en un fragmento de Kotlin
¿ Cómo utilizar las extensiones de Android Kotlin con Fragment
s? Si los uso dentro onCreateView()
, obtengo esta NullPointerException
excepció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
}
}
`
Las propiedades sintéticas de Kotlin no son mágicas y funcionan de una forma muy sencilla. Cuando accedes btn_K
te pide getView().findViewById(R.id.btn_K)
.
El problema es que estás accediendo demasiado pronto. getView()
regresa null
en onCreateView
. Intenta hacerlo en el onViewCreated
método:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
btn_K.setOnClickListener { Log.d(TAG, "onViewCreated(): hello world"); }
}
Está llamando a esto btn_K
demasiado 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{}
}