Como usar as extensões Kotlin Android com Fragment
s? Se eu usá-los dentro onCreateView()
, recebo esta NullPointerException
exceção:
Causado por: java.lang.NullPointerException: tentativa de chamar o método virtual 'android.view.View android.view.View.ind.findViewById (int)' em uma referência de objeto nulo
Aqui está o código do 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
fonte
fonte
rootView.btn_K.setOnClickListener
Respostas:
As propriedades sintéticas de Kotlin não são mágicas e funcionam de uma maneira muito simples. Quando você acessa
btn_K
, ele pedegetView().findViewById(R.id.btn_K)
.O problema é que você está acessando muito cedo.
getView()
retornanull
emonCreateView
. Tente fazer isso noonViewCreated
método:fonte
onViewCreated()
getView()
ou não pode ser chamadafindViewById()
, existe uma maneira de contornar isso? Por exemplo, ensine qual função retornará meu layout?rootView.btn_K
se você tem uma vista (e não apenas em fragmentos, isso pode ser feito em todos os lugares)Você está chamando isso
btn_K
muito cedo, pois nesse momento ele retorna um nulo e está fornecendo uma exceção de ponteiro nulo.Você pode usar essas visualizações por este plug-in sintético no
onActivityCreated()
método chamado logo após oonCreateView()
ciclo de vida do Fragment.fonte
onViewCreated
mas definidas emonActivityCreated
. Não sei porque.Propriedades sintéticos gerados por Kotlin extensões Android plug-in precisa de um
view
paraFragment/Activity
ser definido antes da mão.No seu caso, para
Fragment
, você precisa usarview.btn_K
noonViewCreated
Ou melhor, você deve acessar apenas propriedades sintéticas em
onViewCreated
Observe que o
savedInstanceState
parâmetro deve ser anulávelBundle?
e marque Importando propriedades sintéticasfonte
a única coisa que você precisa fazer é:
fonte
val view = inflater.inflate() view.button.text = "caption"
.rootView.subView.doSomething
. É melhor usar visualizações a partir deonViewCreated
não é necessário definir o objeto complementar, basta chamar todos os IDs por uma visualização como
fonte
Em Fragments, escreva seu código em onActivityCreated: -
fonte
onViewCreated
?No meu caso, nada funcionou até eu seguir o conselho de Otziii nos comentários. Limpe, reconstrua (não é necessário reiniciar), execute novamente o aplicativo. Eu também não precisava ir
onActivityCreated
e apenasonCreateView
fiz o truque.Uma vez, também cometi o erro de aumentar o layout errado, não obtendo obviamente os controles esperados.
fonte
onActivityCreated
demasiadoAdicionando-o à resposta de @Egor Neliuba, Sim, sempre que você chama uma visualização sem referência, o kotlinex procura um rootView e, como você está dentro de um fragmento, o fragmento não possui
getView()
método. Portanto, pode jogarNullPointerException
Existem duas maneiras de superar isso,
onViewCreated()
como mencionadoOu, se quiser vincular visualizações em outra classe (por exemplo, anônima), você pode simplesmente criar uma função de extensão como esta,
fun View.bindViews(){...}
A segunda abordagem é útil quando você possui um único fragmento com comportamento múltiplo.
fonte
}
** Aqui você está usando btn_K.setOnClickListener antes de encontrar -Você precisa encontrar o elemento xml no seu código java / kotlin usando findViewById e somente então você pode executar a operação nessa exibição ou elemento.
-Então é por isso que a execução de ponteiro nulo você tem
**
fonte