square / mortar

A simple library that makes it easy to pair thin views with dedicated controllers, isolated from most of the vagaries of the Activity life cycle.
Apache License 2.0
2.16k stars 156 forks source link

Inflation crash when using Calligraphy #123

Closed nathanielwolf closed 9 years ago

nathanielwolf commented 9 years ago

The following crash occurs on the first view inflation unless CalligraphyConfig.Builder#disableCustomViewInflation() is called during initialization.

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.couchsurfing.mobile.debug/com.couchsurfing.mobile.ui.MainActivity}: android.view.InflateException: Binary XML file line #3: Error inflating class com.couchsurfing.mobile.ui.home.HomeView at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2184) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233) at android.app.ActivityThread.access$800(ActivityThread.java:135) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread.main(ActivityThread.java:5001) at java.lang.reflect.Method.invokeNative(Method.java) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) at dalvik.system.NativeStart.main(NativeStart.java) Caused by: android.view.InflateException: Binary XML file line #3: Error inflating class com.couchsurfing.mobile.ui.home.HomeView at android.view.LayoutInflater.createView(LayoutInflater.java:620) at uk.co.chrisjenx.calligraphy.CalligraphyLayoutInflater.createCustomViewInternal(CalligraphyLayoutInflater.java:206) at uk.co.chrisjenx.calligraphy.CalligraphyLayoutInflater.access$000(CalligraphyLayoutInflater.java:20) at uk.co.chrisjenx.calligraphy.CalligraphyLayoutInflater$PrivateWrapperFactory2.onCreateView(CalligraphyLayoutInflater.java:297) at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:689) at android.view.LayoutInflater.inflate(LayoutInflater.java:469) at uk.co.chrisjenx.calligraphy.CalligraphyLayoutInflater.inflate(CalligraphyLayoutInflater.java:60) at android.view.LayoutInflater.inflate(LayoutInflater.java:397) at com.couchsurfing.mobile.ui.ScreenConductor.inflateLayout(ScreenConductor.java:226) at com.couchsurfing.mobile.ui.ScreenConductor.createView(ScreenConductor.java:221) at com.couchsurfing.mobile.ui.ScreenConductor.createView(ScreenConductor.java:207) at com.couchsurfing.mobile.ui.ScreenConductor.createViewFromScreen(ScreenConductor.java:124) at com.couchsurfing.mobile.ui.ScreenConductor.showScreen(ScreenConductor.java:75) at com.couchsurfing.mobile.ui.base.BaseViewActivity.showScreen(BaseViewActivity.java:78) at com.couchsurfing.mobile.ui.base.BaseActivityPresenter.showScreen(BaseActivityPresenter.java:347) at com.couchsurfing.mobile.ui.MainActivityBlueprint$Presenter.showScreen(MainActivityBlueprint.java:158) at com.couchsurfing.mobile.ui.base.BaseActivityPresenter.onLoad(BaseActivityPresenter.java:167) at com.couchsurfing.mobile.ui.MainActivityBlueprint$Presenter.onLoad(MainActivityBlueprint.java:312) at mortar.Presenter$1.onLoad(Presenter.java:34) at mortar.RealActivityScope.doLoading(RealActivityScope.java:153) at mortar.RealActivityScope.register(RealActivityScope.java:68) at mortar.Presenter.takeView(Presenter.java:73) at com.couchsurfing.mobile.ui.base.BaseActivity.onPostCreate(BaseActivity.java:182) at com.couchsurfing.mobile.ui.MainActivity.onPostCreate(MainActivity.java:143) at android.app.Instrumentation.callActivityOnPostCreate(Instrumentation.java:1150) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2167) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233) at android.app.ActivityThread.access$800(ActivityThread.java:135) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread.main(ActivityThread.java:5001) at java.lang.reflect.Method.invokeNative(Method.java) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) at dalvik.system.NativeStart.main(NativeStart.java) Caused by: java.lang.reflect.InvocationTargetException at java.lang.reflect.Constructor.constructNative(Constructor.java) at java.lang.reflect.Constructor.newInstance(Constructor.java:423) at android.view.LayoutInflater.createView(LayoutInflater.java:594) at uk.co.chrisjenx.calligraphy.CalligraphyLayoutInflater.createCustomViewInternal(CalligraphyLayoutInflater.java:206) at uk.co.chrisjenx.calligraphy.CalligraphyLayoutInflater.access$000(CalligraphyLayoutInflater.java:20) at uk.co.chrisjenx.calligraphy.CalligraphyLayoutInflater$PrivateWrapperFactory2.onCreateView(CalligraphyLayoutInflater.java:297) at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:689) at android.view.LayoutInflater.inflate(LayoutInflater.java:469) at uk.co.chrisjenx.calligraphy.CalligraphyLayoutInflater.inflate(CalligraphyLayoutInflater.java:60) at android.view.LayoutInflater.inflate(LayoutInflater.java:397) at com.couchsurfing.mobile.ui.ScreenConductor.inflateLayout(ScreenConductor.java:226) at com.couchsurfing.mobile.ui.ScreenConductor.createView(ScreenConductor.java:221) at com.couchsurfing.mobile.ui.ScreenConductor.createView(ScreenConductor.java:207) at com.couchsurfing.mobile.ui.ScreenConductor.createViewFromScreen(ScreenConductor.java:124) at com.couchsurfing.mobile.ui.ScreenConductor.showScreen(ScreenConductor.java:75) at com.couchsurfing.mobile.ui.base.BaseViewActivity.showScreen(BaseViewActivity.java:78) at com.couchsurfing.mobile.ui.base.BaseActivityPresenter.showScreen(BaseActivityPresenter.java:347) at com.couchsurfing.mobile.ui.MainActivityBlueprint$Presenter.showScreen(MainActivityBlueprint.java:158) at com.couchsurfing.mobile.ui.base.BaseActivityPresenter.onLoad(BaseActivityPresenter.java:167) at com.couchsurfing.mobile.ui.MainActivityBlueprint$Presenter.onLoad(MainActivityBlueprint.java:312) at mortar.Presenter$1.onLoad(Presenter.java:34) at mortar.RealActivityScope.doLoading(RealActivityScope.java:153) at mortar.RealActivityScope.register(RealActivityScope.java:68) at mortar.Presenter.takeView(Presenter.java:73) at com.couchsurfing.mobile.ui.base.BaseActivity.onPostCreate(BaseActivity.java:182) at com.couchsurfing.mobile.ui.MainActivity.onPostCreate(MainActivity.java:143) at android.app.Instrumentation.callActivityOnPostCreate(Instrumentation.java:1150) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2167) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233) at android.app.ActivityThread.access$800(ActivityThread.java:135) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread.main(ActivityThread.java:5001) at java.lang.reflect.Method.invokeNative(Method.java) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) at dalvik.system.NativeStart.main(NativeStart.java) Caused by: java.lang.IllegalArgumentException: No inject registered for members/com.couchsurfing.mobile.ui.home.HomeView. You must explicitly add it to the 'injects' option in one of your modules. at dagger.ObjectGraph$DaggerObjectGraph.getInjectableTypeBinding(ObjectGraph.java:302) at dagger.ObjectGraph$DaggerObjectGraph.inject(ObjectGraph.java:279) at mortar.Mortar.inject(Mortar.java:93) at com.couchsurfing.mobile.ui.home.HomeView.(HomeView.java:25) at java.lang.reflect.Constructor.constructNative(Constructor.java) at java.lang.reflect.Constructor.newInstance(Constructor.java:423) at android.view.LayoutInflater.createView(LayoutInflater.java:594) at uk.co.chrisjenx.calligraphy.CalligraphyLayoutInflater.createCustomViewInternal(CalligraphyLayoutInflater.java:206) at uk.co.chrisjenx.calligraphy.CalligraphyLayoutInflater.access$000(CalligraphyLayoutInflater.java:20) at uk.co.chrisjenx.calligraphy.CalligraphyLayoutInflater$PrivateWrapperFactory2.onCreateView(CalligraphyLayoutInflater.java:297) at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:689) at android.view.LayoutInflater.inflate(LayoutInflater.java:469) at uk.co.chrisjenx.calligraphy.CalligraphyLayoutInflater.inflate(CalligraphyLayoutInflater.java:60) at android.view.LayoutInflater.inflate(LayoutInflater.java:397) at com.couchsurfing.mobile.ui.ScreenConductor.inflateLayout(ScreenConductor.java:226) at com.couchsurfing.mobile.ui.ScreenConductor.createView(ScreenConductor.java:221) at com.couchsurfing.mobile.ui.ScreenConductor.createView(ScreenConductor.java:207) at com.couchsurfing.mobile.ui.ScreenConductor.createViewFromScreen(ScreenConductor.java:124) at com.couchsurfing.mobile.ui.ScreenConductor.showScreen(ScreenConductor.java:75) at com.couchsurfing.mobile.ui.base.BaseViewActivity.showScreen(BaseViewActivity.java:78) at com.couchsurfing.mobile.ui.base.BaseActivityPresenter.showScreen(BaseActivityPresenter.java:347) at com.couchsurfing.mobile.ui.MainActivityBlueprint$Presenter.showScreen(MainActivityBlueprint.java:158) at com.couchsurfing.mobile.ui.base.BaseActivityPresenter.onLoad(BaseActivityPresenter.java:167) at com.couchsurfing.mobile.ui.MainActivityBlueprint$Presenter.onLoad(MainActivityBlueprint.java:312) at mortar.Presenter$1.onLoad(Presenter.java:34) at mortar.RealActivityScope.doLoading(RealActivityScope.java:153) at mortar.RealActivityScope.register(RealActivityScope.java:68) at mortar.Presenter.takeView(Presenter.java:73) at com.couchsurfing.mobile.ui.base.BaseActivity.onPostCreate(BaseActivity.java:182) at com.couchsurfing.mobile.ui.MainActivity.onPostCreate(MainActivity.java:143) at android.app.Instrumentation.callActivityOnPostCreate(Instrumentation.java:1150) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2167) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233) at android.app.ActivityThread.access$800(ActivityThread.java:135) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread.main(ActivityThread.java:5001) at java.lang.reflect.Method.invokeNative(Method.java) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) at dalvik.system.NativeStart.main(NativeStart.java)

runningcode commented 9 years ago

did you explicitly add com.couchsurfing.mobile.ui.home.HomeView to the injects of one of your modules?

bytehala commented 9 years ago

Happening on mine as well. Yes, the injects SomeView is declared in one of the Screen.Modules. I can only make it work by adding the SomeView to the injects in RootModule. Sucks.

Maybe I just don't know how to use Dagger? IDK

Also, this guy has a point: http://stackoverflow.com/questions/26301133/no-inject-registered-you-must-explicitly-add-it-to-the-injects-option-in-one

bytehala commented 9 years ago

Okay I solved my problem by using ObjectGraphService.inject() on my Views, the crash was caused by Utils.inject(). It was adding to the wrong object graph I guess.

nathanielwolf commented 9 years ago

This was a bug with Calligraphy, solved here https://github.com/chrisjenx/Calligraphy/issues/135