0

I have Activity and Fragment that use View Binding. In Fragment I access a method on Activity to show bottom appbar. when accessing Activity I am getting following exception from Activity method even though I have initialized the binding in onCreate

Caused by: kotlin.UninitializedPropertyAccessException: lateinit property binding has not been initialized

Code look like below

MainActivity.kt

class MainActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        binding = ActivityMainBinding.inflate(layoutInflater) // line 40
        setContentView(binding.root)
    }

    internal fun showFabBottomAppBar() {

         binding.fabCheck.show() // line 145, exception is thrown from here
         binding.bottomAppBar.performShow()
    }
}

MainFragment.kt

class MainFragment : Fragment() {

     private var _binding: FragmentMainBinding? = null
     private val binding get() = _binding!!
     private lateinit var mainActivity: MainActivity

     override fun onCreateView(
         inflater: LayoutInflater, container: ViewGroup?,
         savedInstanceState: Bundle?
     ): View {

         _binding = FragmentMainBinding.inflate(inflater, container, false)

         mainActivity = activity as MainActivity
         mainActivity.showFabBottomAppBar() // line 29

         return binding.root
     }

       override fun onDestroyView() {
            super.onDestroyView()
            _binding = null
       }
}

What's going on here? according to my understanding binding should be initialized with the call of Activity's onCreate

Stacktrace: (I added the line numbers to the code, since above code is simplified)

2022-02-24 06:56:06.980 10194-10194/? E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.mstate, PID: 10194
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.mstate/com.example.mstate.ui.activities.MainActivity}: android.view.InflateException: Binary XML file line #9 in com.example.mstate:layout/activity_main: Binary XML file line #9 in com.example.mstate:layout/activity_main: Error inflating class fragment
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3792)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3968)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2307)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:246)
        at android.app.ActivityThread.main(ActivityThread.java:8512)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)
     Caused by: android.view.InflateException: Binary XML file line #9 in com.example.mstate:layout/activity_main: Binary XML file line #9 in com.example.mstate:layout/activity_main: Error inflating class fragment
     Caused by: android.view.InflateException: Binary XML file line #9 in com.example.mstate:layout/activity_main: Error inflating class fragment
     Caused by: kotlin.UninitializedPropertyAccessException: lateinit property binding has not been initialized
        at com.example.mstate.ui.activities.MainActivity.showFabBottomAppBar$app_debug(MainActivity.kt:145)
        at com.example.mstate.ui.fragments.MainFragment.init(MainFragment.kt:29)
        at com.example.mstate.ui.fragments.MainFragment.onCreateView(MainFragment.kt:23)
        at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2995)
        at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:523)
        at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:261)
        at androidx.fragment.app.FragmentStore.moveToExpectedState(FragmentStore.java:113)
        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1374)
        at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2841)
        at androidx.fragment.app.FragmentManager.dispatchViewCreated(FragmentManager.java:2777)
        at androidx.fragment.app.Fragment.performViewCreated(Fragment.java:3020)
        at androidx.fragment.app.FragmentStateManager.ensureInflatedView(FragmentStateManager.java:394)
        at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:260)
        at androidx.fragment.app.FragmentLayoutInflaterFactory.onCreateView(FragmentLayoutInflaterFactory.java:142)
        at androidx.fragment.app.FragmentController.onCreateView(FragmentController.java:135)
        at androidx.fragment.app.FragmentActivity.dispatchFragmentsOnCreateView(FragmentActivity.java:295)
        at androidx.fragment.app.FragmentActivity.onCreateView(FragmentActivity.java:274)
        at android.view.LayoutInflater.tryCreateView(LayoutInflater.java:1067)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:995)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:959)
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:1121)
        at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:1082)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:680)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:532)
        at com.example.mstate.databinding.ActivityMainBinding.inflate(ActivityMainBinding.java:50)
        at com.example.mstate.databinding.ActivityMainBinding.inflate(ActivityMainBinding.java:44)
        at com.example.mstate.ui.activities.MainActivity.init(MainActivity.kt:40)
2022-02-24 06:56:06.982 10194-10194/? E/AndroidRuntime:     at com.example.mstate.ui.activities.MainActivity.onCreate(MainActivity.kt:36)
        at android.app.Activity.performCreate(Activity.java:8198)
        at android.app.Activity.performCreate(Activity.java:8182)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1309)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3765)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3968)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2307)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:246)
        at android.app.ActivityThread.main(ActivityThread.java:8512)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)
user158
  • 12,852
  • 7
  • 62
  • 94
  • Is `MainFragment` in the layout somewhere? If so, its `onCreateView()` is running during the `ActivityMainBinding.inflate(layoutInflater)` call, at which point `binding` is still null. – Mike M. Feb 24 '22 at 02:19
  • can you add the stacktrace – rahat Feb 24 '22 at 02:22
  • @rahat added the stacktrace – user158 Feb 24 '22 at 02:29
  • in your layout three is an issue, use fragmentcontainerview instead of fragment tag – rahat Feb 24 '22 at 02:38
  • fix your activity main layout file – rahat Feb 24 '22 at 02:38
  • @MikeM. User navigate to the `MainFragment` if he/she is signed in: `navController.navigate(R.id.action_signIn_to_main) // line 81 MainActivity.kt` – user158 Feb 24 '22 at 02:38
  • Yeah, but that stack trace is saying you've got one in a `` in the layout, too. rahat's got the proper suggestions. – Mike M. Feb 24 '22 at 02:39
  • @rahat moving to fragmentContainer worked even thought it needed some code changes as described [here](https://stackoverflow.com/a/58859118/7356355). Can you please write an answer explaining the situation in my case. – user158 Feb 24 '22 at 03:07
  • https://stackoverflow.com/questions/60591463/class-inflation-error-regarding-fragments it can help you understand the usage of fragment tag – rahat Feb 24 '22 at 03:52

0 Answers0