androidbroadcast / ViewBindingPropertyDelegate

Make work with Android View Binding simpler
https://proandroiddev.com/make-android-view-binding-great-with-kotlin-b71dd9c87719
Apache License 2.0
1.42k stars 102 forks source link

How to use viewbinding delegate for activity correctly? App crashes with: Unable to start activity ComponentInfo #29

Closed Berki2021 closed 3 years ago

Berki2021 commented 3 years ago

I am trying to use the viewbinding delegate in my mainactivity. The problem is that my app instantly crashes, what am I doing wrong?

MainActivity

@AndroidEntryPoint

class MainActivity : AppCompatActivity() {
    private val mainBinding: ActivityMainBinding by viewBinding()

    override fun onCreate(savedInstanceState: Bundle?){
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        changeBottomNavWhenUserLoggedIn(true)
    }

    private fun changeBottomNavWhenUserLoggedIn(loggedIn: Boolean) {
        if (loggedIn){
            setUpBottomNav(R.menu.bottom_nav_menu_logged_in)
        } else {
            setUpBottomNav(R.menu.bottom_nav_menu_logged_out)
        }
    }

    private fun setUpBottomNav(newMenu: Int) = with(mainBinding.bottomNavigationView) {
        menu.clear()
        inflateMenu(newMenu)
        setupWithNavController(findNavController(R.id.fragment_container))
    }

    fun hideBottomNav() {
        mainBinding.bottomNavigationView.visibility = View.GONE
    }

    fun showBottomNav() {
        mainBinding.bottomNavigationView.visibility = View.VISIBLE
    }

    fun isBottomNavVisible(): Boolean {
        return mainBinding.bottomNavigationView.visibility == View.VISIBLE
    }
}

Layout

<?xml version="1.0" encoding="utf-8"?>
<layout>

    <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".framework.ui.view.MainActivity">

        <fragment
            android:id="@+id/fragment_container"
            android:name="com.example.app.framework.ui.view.utils.MainNavHostFragment"
            android:layout_width="match_parent"
            android:layout_height="@dimen/wrapContent"
            app:defaultNavHost="true"
            app:layout_constraintBottom_toTopOf="@+id/bottomNavigationView"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:navGraph="@navigation/nav_main" />

        <com.google.android.material.bottomnavigation.BottomNavigationView
            android:id="@+id/bottomNavigationView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:itemHorizontalTranslationEnabled="false"
            app:labelVisibilityMode="labeled"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:menu="@menu/bottom_nav_menu_logged_out" />
    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

Crash log

2020-12-11 23:14:57.457 11101-11101/com.example3000.app E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example3000.app, PID: 11101
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example3000.app/com.example3000.app.framework.ui.view.MainActivity}: java.lang.reflect.InvocationTargetException
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3270)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
        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:2016)
        at android.os.Handler.dispatchMessage(Handler.java:107)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7356)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
     Caused by: java.lang.reflect.InvocationTargetException
        at java.lang.reflect.Method.invoke(Native Method)
        at by.kirich1409.viewbindingdelegate.ActivityInflateViewBinder.bind(ActivityInflateBindings.kt:31)
        at com.example3000.app.framework.ui.view.MainActivity$$special$$inlined$inflateViewBindingActivity$1.invoke(ActivityInflateBindings.kt:44)
        at com.example3000.app.framework.ui.view.MainActivity$$special$$inlined$inflateViewBindingActivity$1.invoke(Unknown Source:2)
        at by.kirich1409.viewbindingdelegate.ViewBindingProperty.getValue(ViewBindingProperty.kt:31)
        at com.example3000.app.framework.ui.view.MainActivity.getMainBinding(Unknown Source:7)
        at com.example3000.app.framework.ui.view.MainActivity.setUpBottomNav(MainActivity.kt:31)
        at com.example3000.app.framework.ui.view.MainActivity.changeBottomNavWhenUserLoggedIn(MainActivity.kt:25)
        at com.example3000.app.framework.ui.view.MainActivity.onCreate(MainActivity.kt:20)
        at android.app.Activity.performCreate(Activity.java:7802)
        at android.app.Activity.performCreate(Activity.java:7791)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1299)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3245)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409) 
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) 
        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:2016) 
        at android.os.Handler.dispatchMessage(Handler.java:107) 
        at android.os.Looper.loop(Looper.java:214) 
        at android.app.ActivityThread.main(ActivityThread.java:7356) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930) 
     Caused by: android.view.InflateException: Binary XML file line #11 in com.example3000.app:layout/activity_main: Binary XML file line #11 in com.example3000.app:layout/activity_main: Error inflating class fragment
     Caused by: android.view.InflateException: Binary XML file line #11 in com.example3000.app:layout/activity_main: Error inflating class fragment
     Caused by: java.lang.IllegalArgumentException: Binary XML file line #11: Duplicate id 0x7f09013f, tag null, or parent id 0xffffffff with another fragment for com.example3000.app.framework.ui.view.utils.MainNavHostFragment
        at androidx.fragment.app.FragmentLayoutInflaterFactory.onCreateView(FragmentLayoutInflaterFactory.java:116)
        at androidx.fragment.app.FragmentController.onCreateView(FragmentController.java:135)
        at androidx.fragment.app.FragmentActivity.dispatchFragmentsOnCreateView(FragmentActivity.java:356)
        at androidx.fragment.app.FragmentActivity.onCreateView(FragmentActivity.java:335)
        at android.view.LayoutInflater.tryCreateView(LayoutInflater.java:1069)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:997)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:961)
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:1123)
        at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:1084)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:682)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:534)
        at androidx.databinding.DataBindingUtil.inflate(DataBindingUtil.java:126)
        at androidx.databinding.ViewDataBinding.inflateInternal(ViewDataBinding.java:1368)
        at com.example3000.app.databinding.ActivityMainBinding.inflate(ActivityMainBinding.java:62)
2020-12-11 23:14:57.458 11101-11101/com.example3000.app E/AndroidRuntime:     at com.example3000.app.databinding.ActivityMainBinding.inflate(ActivityMainBinding.java:48)
        at java.lang.reflect.Method.invoke(Native Method)
        at by.kirich1409.viewbindingdelegate.ActivityInflateViewBinder.bind(ActivityInflateBindings.kt:31)
        at com.example3000.app.framework.ui.view.MainActivity$$special$$inlined$inflateViewBindingActivity$1.invoke(ActivityInflateBindings.kt:44)
        at com.example3000.app.framework.ui.view.MainActivity$$special$$inlined$inflateViewBindingActivity$1.invoke(Unknown Source:2)
        at by.kirich1409.viewbindingdelegate.ViewBindingProperty.getValue(ViewBindingProperty.kt:31)
        at com.example3000.app.framework.ui.view.MainActivity.getMainBinding(Unknown Source:7)
        at com.example3000.app.framework.ui.view.MainActivity.setUpBottomNav(MainActivity.kt:31)
        at com.example3000.app.framework.ui.view.MainActivity.changeBottomNavWhenUserLoggedIn(MainActivity.kt:25)
        at com.example3000.app.framework.ui.view.MainActivity.onCreate(MainActivity.kt:20)
        at android.app.Activity.performCreate(Activity.java:7802)
        at android.app.Activity.performCreate(Activity.java:7791)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1299)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3245)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
        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:2016)
        at android.os.Handler.dispatchMessage(Handler.java:107)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7356)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)

Thank you

DatL4g commented 3 years ago

Use setContentView(mainBinding.root) instead of setContentView(R.layout.activity_main) in onCreate() method