When developing Android apps using Kotlin, a common issue faced by developers is when findViewById returns null, causing a NullPointerException. This typically happens due to improper view binding, incorrect layout reference, or accessing the view before setContentView is called.

In this article, we will explore multiple solutions to fix the findViewById null issue in Kotlin with proper code examples. Whether you’re using traditional findViewById, View Binding, or Kotlin synthetic properties, the key is to access the views after the layout has been correctly set.
We’ll also walk through the correct setup using both Activity and Fragment in Android.
Common Causes of findViewById Returning Null
setContentViewis not called before accessing views.- Wrong layout file is passed to
setContentView. - Wrong view ID used in
findViewById. - Using
findViewByIdin aFragmentbefore the view is created.
Solution 1: Correct Order in Activity
// MainActivity.kt
import android.os.Bundle
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
class MainActivity : AppCompatActivity() {
private lateinit var myTextView: TextView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main) // Must come before findViewById
myTextView = findViewById(R.id.textView)
myTextView.text = "Hello, Kotlin!"
}
}
Solution 2: Use View Binding (Recommended)
View Binding helps reduce nullability and is more robust than findViewById.
// MainActivity.kt
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import com.example.app.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.textView.text = "Hello with ViewBinding"
}
}
Solution 3: Correct findViewById in Fragment
// ExampleFragment.kt
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.fragment.app.Fragment
class ExampleFragment : Fragment() {
private lateinit var textView: TextView
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val view = inflater.inflate(R.layout.fragment_example, container, false)
textView = view.findViewById(R.id.textView)
textView.text = "Fragment View Loaded"
return view
}
}
External Reference
For official documentation on View Binding in Android, visit Android Developers.