NullPointerException when trying to access views in a Kotlin fragment NullPointerException when trying to access views in a Kotlin fragment android android

NullPointerException when trying to access views in a Kotlin fragment


Kotlin synthetic properties are not magic and work in a very simple way. When you access btn_K, it calls for getView().findViewById(R.id.btn_K).

The problem is that you are accessing it too soon. getView() returns null in onCreateView. Try doing it in the onViewCreated method:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {    btn_K.setOnClickListener { Log.d(TAG, "onViewCreated(): hello world"); }}


You are calling this btn_K too soon as at that time it returns a null and is giving you Null Pointer Exception.

You can use these views by this synthetic plugin in onActivityCreated() method which is called just after onCreateView() of Fragment lifecycle.

onActivityCreated(){        super.onActivityCreated(savedInstanceState)        btn_K.setOnClickListener{}}


Synthetic properties generated by Kotlin Android Extensions plugin needs a view for Fragment/Activity to be set before hand.

In your case, for Fragment, you need to use view.btn_K in onViewCreated

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {    super.onCreateView(inflater, container, savedInstanceState)    val view = inflater.inflate(R.layout.fragment_card_selector, container, false)    view.btn_K.setOnClickListener{} // access with `view`    return view}

Or better, you should only access synthetic properties in onViewCreated

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {    super.onCreateView(inflater, container, savedInstanceState)    return inflater.inflate(R.layout.fragment_card_selector, container, false)}override fun onViewCreated(view: View, savedInstanceState: Bundle?) {    super.onViewCreated(view, savedInstanceState)    btn_K.setOnClickListener{} // access without `view`}

Please notice that savedInstanceState parameter should be nullable Bundle?, and also check Importing synthetic properties

It is convenient to import all widget properties for a specific layout in one go:

import kotlinx.android.synthetic.main.<layout>.*

Thus if the layout filename is activity_main.xml, we'd import kotlinx.android.synthetic.main.activity_main.*.

If we want to call the synthetic properties on View, we should also import kotlinx.android.synthetic.main.activity_main.view.*.