¿Cómo usar Kotlin Android Extensions con Fragment
s? Si los uso adentro 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 de 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
}
}
`
android
kotlin
kotlin-android-extensions
solidak
fuente
fuente
rootView.btn_K.setOnClickListener
Respuestas:
Las propiedades sintéticas de Kotlin no son mágicas y funcionan de una manera muy simple. Cuando accedes
btn_K
, pidegetView().findViewById(R.id.btn_K)
.El problema es que está accediendo a él demasiado pronto.
getView()
vuelvenull
a entraronCreateView
. Intenta hacerlo en elonViewCreated
método:fuente
onViewCreated()
getView()
o no puede invocarfindViewById()
, ¿hay alguna forma de evitarla? Por ejemplo, ¿enseñarle qué función devolverá mi diseño?rootView.btn_K
si tuviera una vista (y no solo en fragmentos, esto se puede hacer en todas partes)Está llamando a esto
btn_K
demasiado pronto ya que en ese momento devuelve un valor nulo y le está dando una excepción de puntero nulo.Puede usar estas vistas mediante este complemento sintético en un
onActivityCreated()
método que se llama justo despuésonCreateView()
del ciclo de vida de Fragment.fuente
onViewCreated
pero luego definidosonActivityCreated
. Sin embargo, no sé por qué.Propiedades sintéticos generados por Kotlin Extensiones Android plug-in necesita una
view
paraFragment/Activity
ser fijado de antemano.En su caso, para
Fragment
, debe usarview.btn_K
enonViewCreated
O mejor, solo debe acceder a las propiedades sintéticas en
onViewCreated
Tenga en cuenta que el
savedInstanceState
parámetro debe ser anulableBundle?
, y también marque Importar propiedades sintéticasfuente
lo único que debes hacer es:
fuente
val view = inflater.inflate() view.button.text = "caption"
.rootView.subView.doSomething
. Es mejor usar vistas a partir deonViewCreated
no es necesario definir un objeto complementario, solo llame a cada id por una vista como
fuente
En Fragments, escriba su código en onActivityCreated: -
fuente
onViewCreated
lugar?En mi caso, nada funcionó hasta que seguí el consejo de Otziii en los comentarios. Limpie, reconstruya (no es necesario reiniciar), vuelva a ejecutar la aplicación. Tampoco necesitaba ir
onActivityCreated
y soloonCreateView
hice el truco.Una vez también cometí el error de inflar el diseño incorrecto, por lo que obviamente no obtuve los controles esperados.
fuente
onActivityCreated
demasiadoAgregándolo a la respuesta de @Egor Neliuba, Sí, cada vez que llama a una vista sin referencia, kotlinex busca un rootView, y dado que está dentro de un fragmento y el fragmento no tiene
getView()
método. Por lo tanto, podría arrojarNullPointerException
Hay dos formas de superar esto,
onViewCreated()
como se mencionóO bien, si desea vincular vistas en otra clase (por ejemplo, anónimo), simplemente puede crear una función de extensión como esta,
fun View.bindViews(){...}
El segundo enfoque es útil cuando tiene un solo fragmento con múltiples comportamientos.
fuente
}
** Aquí está utilizando btn_K.setOnClickListener antes de buscar. Debe encontrar el elemento xml en su código java / kotlin utilizando findViewById y luego solo puede realizar la operación en esa vista o elemento.
-Así que es por eso que tienes puntero nulo
** **
fuente