0

I used to have a MvxSpinned control to select an item from a list. After recent migration from MvvmCross 4.x to 5.x it stopped working, crash the app in an attempt to bind the MvxSpinner

<MvxSpinner
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    local:MvxBind="ItemsSource MyList;SelectedItem ItemFromTheList;Visible IsItemSelectorEnabled" />

And the error (crash) is basically sais that some resource couldn't be found during the list item view inflation

Java.Interop.JniEnvironmentResource ID #0x0
Raw
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()<896ad1d315ca4ba7b117efb8dacaedcf>:0
Java.Interop.JniEnvironment.InstanceMethods.CallNonvirtualObjectMethod(JniObjectReference instance, JniObjectReference type, JniMethodInfo method, JniArgumentValue* args)<7cfbebb561c54efc9010b018c0846c7e>:0
Java.Interop.JniPeerMembers.JniInstanceMethods.InvokeVirtualObjectMethod(string encodedMember, IJavaPeerable self, JniArgumentValue* parameters)<7cfbebb561c54efc9010b018c0846c7e>:0
Android.Views.LayoutInflater.Inflate(int resource, ViewGroup root, bool attachToRoot)<e975227ac8644a30bb0866117325de0d>:0
MvvmCross.Binding.Droid.Views.MvxLayoutInflater.Inflate(int resource, ViewGroup root, bool attachToRoot)<0f7a6d7740764835ab4a872238640fdc>:0
MvvmCross.Binding.Droid.BindingContext.MvxAndroidBindingContext.CommonInflate(int resourceId, ViewGroup viewGroup, bool attachToRoot)<0f7a6d7740764835ab4a872238640fdc>:0
MvvmCross.Binding.Droid.BindingContext.MvxAndroidBindingContext.BindingInflate(int resourceId, ViewGroup viewGroup, bool attachToRoot)<0f7a6d7740764835ab4a872238640fdc>:0
MvvmCross.Binding.Droid.Views.MvxListItemView.MvxListItemView(Context context, IMvxLayoutInflaterHolder layoutInflaterHolder, object dataContext, ViewGroup parent, int templateId)<0f7a6d7740764835ab4a872238640fdc>:0
MvvmCross.Binding.Droid.Views.MvxAdapter.CreateBindableView(object dataContext, ViewGroup parent, int templateId)<0f7a6d7740764835ab4a872238640fdc>:0
MvvmCross.Binding.Droid.Views.MvxAdapter.GetBindableView(View convertView, object dataContext, ViewGroup parent, int templateId)<0f7a6d7740764835ab4a872238640fdc>:0
MvvmCross.Binding.Droid.Views.MvxAdapter.GetView(int position, View convertView, ViewGroup parent, int templateId)<0f7a6d7740764835ab4a872238640fdc>:0
MvvmCross.Binding.Droid.Views.MvxAdapter.GetView(int position, View convertView, ViewGroup parent)<0f7a6d7740764835ab4a872238640fdc>:0
Android.Widget.BaseAdapter.n_GetView_ILandroid_view_View_Landroid_view_ViewGroup_(IntPtr jnienv, IntPtr native__this, int position, IntPtr native_convertView, IntPtr native_parent)<e975227ac8644a30bb0866117325de0d>:0
at (wrapper dynamic-method) System.Object:a5f970b5-8275-430d-a4b9-72fe165e02cc (intptr,intptr,int,intptr,intptr)
--- End of managed Android.Content.Res.Resources+NotFoundException stack trace ---
android.content.res.Resources$NotFoundException: Resource ID #0x0
at android.content.res.Resources.getValue(Resources.java:1266)
at android.content.res.Resources.loadXmlResourceParser(Resources.java:2652)
at android.content.res.Resources.getLayout(Resources.java:1082)
at android.view.LayoutInflater.inflate(LayoutInflater.java:412)
md568b3ec281d538477a14850a575f79ed6.MvxAdapter.n_getView(Native Method)
at md568b3ec281d538477a14850a575f79ed6.MvxAdapter.getView(MvxAdapter.java:92)
at android.widget.AbsSpinner.onMeasure(AbsSpinner.java:197)
at android.widget.Spinner.onMeasure(Spinner.java:507)
at android.support.v7.widget.AppCompatSpinner.onMeasure(AppCompatSpinner.java:426)
at android.view.View.measure(View.java:17565)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5537)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:722)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:613)
at android.view.View.measure(View.java:17565)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5537)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:722)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:613)
at android.view.View.measure(View.java:17565)
at android.widget.ScrollView.measureChildWithMargins(ScrollView.java:1263)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:436)
at android.widget.ScrollView.onMeasure(ScrollView.java:337)
at android.view.View.measure(View.java:17565)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5537)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:722)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:613)
at android.view.View.measure(View.java:17565)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5537)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:436)
at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:139)
at android.view.View.measure(View.java:17565)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5537)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:722)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:613)
at android.view.View.measure(View.java:17565)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5537)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:436)
at android.view.View.measure(View.java:17565)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5537)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:722)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:613)
at android.view.View.measure(View.java:17565)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5537)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:436)
at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2615)
at android.view.View.measure(View.java:17565)
at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2045)
at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1196)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1409)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1084)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5990)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767)
at android.view.Choreographer.doCallbacks(Choreographer.java:580)
at android.view.Choreographer.doFrame(Choreographer.java:550)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5343)
java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:905)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:700)
Mando
  • 11,414
  • 17
  • 86
  • 167
  • The code you have post has no problem, I think we'd likely need to see some code to help you pinpoint the problem – York Shen Nov 02 '17 at 09:29
  • this is a default MvxSpinner with default adapter and default item template, the only customization here is the binding which is specified above. What kind of code can I provide on top of it to dive deeper? – Mando Nov 02 '17 at 09:31
  • I cant reproduce your problem, my MvvmCross version is `5.3.2.0`. Could you please share a basic demo to reproduce this problem? – York Shen Nov 02 '17 at 09:35
  • I do not have an example, I use MvvmCross 5.4 – Mando Nov 03 '17 at 01:50
  • Clean your solution, delete the `bin` and `obj` folder, and rebuild again. Usually it will generate automatically. – York Shen Nov 03 '17 at 05:27
  • It is strange it is looking for Resource ID #0x0. If you don't supply a item layout it will default to: `Android.Resource.Layout.SimpleSpinnerItem`. So as @YorkShen-MSFT suggests. Try delete the bin and obj folders. If your issue still persists, create a repro sample and perhaps open an issue on GitHub. – Cheesebaron Nov 07 '17 at 16:57

2 Answers2

3

Got the same error as you did. The solution is to set explicitly spinner's ItemTemplateId and DropDownItemTemplateId in your Activity(or Fragment), for instance:

MvxAppCompatSpinner spinner = FindViewById<MvxAppCompatSpinner>(Resource.Id.spinner);
spinner.ItemTemplateId = Android.Resource.Layout.SimpleSpinnerItem;
spinner.DropDownItemTemplateId = Android.Resource.Layout.SimpleSpinnerDropDownItem;
Krumiasty
  • 48
  • 1
  • 6
  • Looks like you're totally right, even though the documentation said this was not required. – Jeff Feb 12 '19 at 04:57
0

To build on Krum's solution, one can also directly set the MvxItemTemplate and MvxDropDownItemTemplate directly in the XML so as to avoid having to intercept the spinner creation in the view code:

local:MvxItemTemplate="@android:layout/simple_spinner_item"                  
local:MvxDropDownItemTemplate="@android:layout/simple_spinner_dropdown_item"

Careful here, we need to specify the template, not the id.

Jeff
  • 522
  • 7
  • 26