MVVMCross Binding 导致 Android 应用程序崩溃

2024-01-27

我有一个基于 Xamarin 和 MvvmCross 的 Android 应用程序。 在该应用程序中,有一个带有我自己创建的 ExpandableListView 的视图。 现在,此列表显示几个项目,这些项目使用 MvvmCross 绑定到其 DataContext。 但是,由于各个 ListItemView 的视图差异很大,因此这些 ListItemView 的一部分是在 ExpandedListViewAdapter 中以编程方式生成的。 这工作起来就像这样:

        public override View GetChildView(int groupPosition, int childPosition, bool isLastChild, View convertView, ViewGroup parent)
        {
            object child = GetRawChild(groupPosition, childPosition);

            if (child == null)
            {
                MvxBindingTrace.Trace(MvxTraceLevel.Error, "GetView called for group that seems to have no itemssource: it is null");
                return null;
            }

            var view = (MvxListItemView)GetBindableView(convertView, child, ChildItemTemplateId);
            var placeholder = view.FindViewById<BindableFrameLayout>(Resource.Id.placeholder);

            var questionVm = (QuestionViewModel)child;

            if(questionVm.ViewType == "TextBox")
            {
                    placeholder.RemoveAllViews();

                    var text = new BindableEditText(context);

                    text.InputType = InputType;
                    text.SetRawInputType(InputType);
                    placeholder.RemoveAllViews();
                    placeholder.AddView(text);

                    var answer = questionVm.Children.First();
                    text.DataContext = answer;
                    var binding = text.CreateInlineBindingTarget<AnswerViewModel>();
                    text.Bind(binding, et => et.Text, vm => vm.Model.Value, (string)null, null, null,
                              MvxBindingMode.TwoWay);
            }
            else if(questionVm.ViewType == "Spinner")
            {
                    placeholder.RemoveAllViews();

                    MvxSpinner spinner = new MvxSpinner(context, null);
                    spinner.ItemsSource = questionVm.Children;
                    spinner.ItemSelected += (sender, args) =>
                    {
                        for (int i = 0; i < questionVm.Children.Count; i++)
                        {
                            var answer = (IAnswerViewModel)questionVm.Children[i];
                            if (i == spinner.SelectedItemPosition)
                                answer.IsSelected = true;
                            else
                                answer.IsSelected = false;
                        }
                    };
                    spinner.Bind(bindings, ctrl => ctrl.ItemsSource, vm => vm.Children, (string)null, null, null, MvxBindingMode.OneWay);
                    var chosenAnswer = questionVm.Children.Cast<IAnswerViewModel>().FirstOrDefault(@a => @a.IsSelected == true);
                    if (chosenAnswer != null)
                        spinner.SetSelection(questionVm.Children.Cast<IAnswerViewModel>().ToList().IndexOf(chosenAnswer));
                    placeholder.AddView(spinner);
            }

...“BindableEditText”如下所示: 使用系统; 使用 Android.Content; 使用Android.Runtime; 使用 Android.Views; 使用Android.Widget; 使用 Android.Util; 使用 Cirrious.MvvmCross.Binding.Droid.BindingContext; 使用 Cirrious.MvvmCross.Binding.BindingContext;

        namespace iCL.Filler.Droid.Controls
        {
            public class BindableEditText : EditText, IMvxBindingContextOwner
            {
                private readonly IMvxAndroidBindingContext _bindingContext;

                public BindableEditText(Context context)
                    : base(context)
                {
                    _bindingContext = new MvxAndroidBindingContext(context, null);
                }

                public BindableEditText(Context context, IAttributeSet attributes)
                    : base(context, attributes)
                {
                    _bindingContext = new MvxAndroidBindingContext(context, null);
                }

                public BindableEditText(Context context, IAttributeSet attributes, int defStyle)
                    : base(context, attributes, defStyle)
                {
                    _bindingContext = new MvxAndroidBindingContext(context, null);
                }

                public BindableEditText(IntPtr javaReference, JniHandleOwnership transfer)
                    : base(javaReference, transfer)
                {
                }

                protected IMvxAndroidBindingContext AndroidBindingContext
                {
                    get { return _bindingContext; }
                }

                public IMvxBindingContext BindingContext
                {
                    get { return _bindingContext; }
                    set { throw new NotImplementedException("BindingContext is readonly in the radio button"); }
                }

                protected override void Dispose(bool disposing)
                {
                    if (disposing)
                    {
                        this.BindingContext.ClearAllBindings();
                    }

                    base.Dispose(disposing);
                }

                public override void SetText(Java.Lang.ICharSequence text, TextView.BufferType type)
                {
                    try
                    {
                        base.SetText(text, type);
                    }
                    catch (Exception ex)
                    {

                    }
                }

                protected View Content { get; set; }

                public object DataContext
                {
                    get { return _bindingContext.DataContext; }
                    set { _bindingContext.DataContext = value; }
                }
            }
        }

所以我的问题是,偶尔,当我滚动并单击列表视图时,我会收到如下所示的运行时错误,并且我的应用程序“崩溃”,这意味着它实际上导航回上一个屏幕。

10-29 14:04:37.140 D/dalvikvm( 5989): GC_EXPLICIT freed 751K, 11% free 11369K/12679K, paused 0ms+1ms
10-29 14:04:39.970 D/dalvikvm( 5989): GC_FOR_ALLOC freed 715K, 16% free 10692K/12679K, paused 5ms
10-29 14:04:41.831 E/mono-rt ( 5989): Stacktrace:
10-29 14:04:41.831 E/mono-rt ( 5989): 
10-29 14:04:41.831 E/mono-rt ( 5989):   at <unknown> <0xffffffff>
10-29 14:04:41.831 E/mono-rt ( 5989):   at (wrapper managed-to-native) object.wrapper_native_0xb71f1820 (intptr,intptr,intptr,intptr,Android.Runtime.JValue[]) <IL 0x00124, 0xffffffff>
10-29 14:04:41.831 E/mono-rt ( 5989):   at Android.Runtime.JNIEnv.CallNonvirtualVoidMethod (intptr,intptr,intptr,Android.Runtime.JValue[]) [0x00000] in /Users/builder/data/lanes/monodroid-mlion-monodroid-4.8.2-branch/a25a31d0/source/monodroid/src/Mono.Android/src/Runtime/JNIEnv.g.cs:612
10-29 14:04:41.831 E/mono-rt ( 5989):   at Android.Widget.CompoundButton.set_Checked (bool) [0x00070] in /Users/builder/data/lanes/monodroid-mlion-monodroid-4.8.2-branch/a25a31d0/source/monodroid/src/Mono.Android/platforms/android-14/src/generated/Android.Widget.CompoundButton.cs:255
10-29 14:04:41.831 E/mono-rt ( 5989):   at (wrapper runtime-invoke) <Module>.runtime_invoke_void__this___byte (object,intptr,intptr,intptr) <IL 0x00054, 0xffffffff>
10-29 14:04:41.831 E/mono-rt ( 5989):   at <unknown> <0xffffffff>
10-29 14:04:41.831 E/mono-rt ( 5989):   at (wrapper managed-to-native) System.Reflection.MonoMethod.InternalInvoke (System.Reflection.MonoMethod,object,object[],System.Exception&) <IL 0x00030, 0xffffffff>
10-29 14:04:41.831 E/mono-rt ( 5989):   at System.Reflection.MonoMethod.Invoke (object,System.Reflection.BindingFlags,System.Reflection.Binder,object[],System.Globalization.CultureInfo) <IL 0x0004a, 0x0016f>
10-29 14:04:41.831 E/mono-rt ( 5989):   at System.Reflection.MethodBase.Invoke (object,object[]) <IL 0x00006, 0x00048>
10-29 14:04:41.831 E/mono-rt ( 5989):   at Cirrious.MvvmCross.Binding.Bindings.Target.MvxPropertyInfoTargetBinding.SetValueImpl (object,object) <IL 0x0001a, 0x000a7>
10-29 14:04:41.831 E/mono-rt ( 5989):   at Cirrious.MvvmCross.Binding.Bindings.Target.MvxConvertingTargetBinding.SetValue (object) <IL 0x0008c, 0x002b1>
The program 'Mono' has exited with code 0 (0x0).

我不知道可能是什么问题...... 有没有可能,某个 Java 对象已经完成,并且我的绑定尝试调用它?


遵循提供的代码片段有点困难,但我猜您所看到的问题是由于您正在回收cell每次回收它时,您都会:

  • 创建一个新的单元格子视图,
  • 创建一个新的绑定,
  • 清除旧的子视图
  • but not删除旧的绑定。

解决这个问题的一种方法可能是使用WithClearBindingKey流畅的方法允许您清除这些绑定。

例如,如果绑定创建为:

 var set = this.CreateBindingSet<Cell, CellViewModel>();
 set.Bind(text).To(vm => vm.TextValue).WithClearBindingKey("MyDynamicBindings");
 set.Apply();

那么只能使用以下命令清除使用此标记创建的绑定:

 this.ClearBindings("MyDynamicBindings");
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MVVMCross Binding 导致 Android 应用程序崩溃 的相关文章

随机推荐

  • 在C#3.0中是否有更好的方法来编写这行C#代码?

    我有一个财产声明如下 public decimal MyProperty get set 我需要将此值作为字符串传递给另一个方法 因此我认为这样做的唯一方法如下 MyProperty null null MyProperty ToStrin
  • Pandas 数据框转换:从字典 k-v 对中添加列[重复]

    这个问题在这里已经有答案了 我想将 DataFrame 转换为如下所示 dictionary 0 b 2 a 1 1 c 4 b 3 from import pandas df pandas DataFrame df dictionary
  • Eclipse:如何删除添加到 Jar 中的附加源

    我正在使用 Eclipse IDE Helios 版本 作为构建路径的一部分 我有一个该应用程序的 jar 文件 我已使用附加源选项附加了该 jar 文件的源代码 请告诉我如何删除该 jar 文件的附加源 打开 classpath文件并删除
  • JSONStore Worklight - 大小限制

    JSONStore 为我们提供了一种与服务器同步数据并跟踪用户在离线状态下所做的更改的好方法 JSONStore 上可以保存的信息量是否有限制 我发现 Webkit 数据库有 5 MB 的限制 而 SQLLite 数据库则没有限制 还想知道
  • 从短代码函数内部调用 WordPress get_template_part 首先呈现模板

    我有一个页面需要允许用户输入一段文本 然后在该文本后面插入一个短代码来呈现帖子列表 然后添加更多自由格式的文本 我的想法是他们应该能够插入一个短代码来输出帖子 这样他们就可以简单地在他们希望帖子出现的地方添加短代码 我目前的逻辑是检索在自己
  • Rails form_tag url 路径

    这看起来应该很简单 但它一直给我带来问题 我有一个从模型中提取的 select tag 我想要的只是让一个人从下拉列表中选择他们的位置 按提交并将其带到该地点页面 这是我所拥有的 div p p div 问题是它当然想要一个 id但它不会拉
  • 如何从 VBA 调用 python 程序?

    正如标题所说 我有一个 python 程序 它处理我从电子邮件下载的一些数据文件 我正在编写一个vba脚本 它可以下载电子邮件附件并执行python程序来处理电子邮件附件 这样我就可以自动化我的日常工作 任何想法 一种方法是将 Python
  • 纯java sqlite库?

    I saw Java 和 SQLite https stackoverflow com questions 41233 java and sqlite 但是哪些是纯java制作的并且是平台无关的呢 另外 从哪一个开始最好 我从来没有使用过s
  • 字谜算法

    这是为文本生成字谜词的最佳方法 最多 80 个字符长度 例子 输入 狗 输出狗 dgo odg ogd gdo 神 我只是在考虑回溯解决方案 但如果文本较长 这将需要一段时间 另一个想法是我尝试字典中的所有单词 但问题并不要求真正的单词 有
  • 将 pdf 转换为矢量图像

    我正在尝试在我的网页中使用 pdf 内容 数学 我基本上想将 pdf 转换为一些矢量图像 将 pdf 转换为 swf 可以很好地完成这项工作 但由于并非每个平台都支持 flash 因此我正在尝试寻找另一种解决方案 我读过有关 svg 的内容
  • Azure DocumentDB 多租户架构

    我一直在预览期间将 DocumentDB 实现到多租户系统中 我的计划是在 DocumentDB 帐户下为每个注册的租户生成一个新数据库 大部分代码已经就位 并且测试进展非常顺利 由于 DocumentDB 已正式发布并且文档已最终确定 我
  • 使用 JavaScript 将 HTML 字符串加载到 iframe 中

    我有一串 HTML 标签 可以随时添加或更改 是否可以在运行时将该字符串加载到 Iframe 中 就好像它是 HTML 文件一样 这是针对构造 2 的 我有一个可以从 url 加载 HTML 的对象 它还可以插入 HTML 并运行脚本 但不
  • Flutter 毫不延迟地导航到屏幕

    我有一个登录屏幕 在我的表单按钮中 我进行检查 然后调用共享首选项来设置登录标志 并且 initState 我调用一个方法来检查值并重定向到主屏幕 现在一切都很顺利 但我能够看到登录表单一秒钟左右 然后我被重定向到主页 我希望根本看不到登录
  • 使用 YAML-CPP 将 YAML Emitter 内容保存到文件中

    我刚刚开始使用 yaml cpp 我设法正确构建它并运行 yaml cpp wiki 中的一些示例 但我找不到将发射器保存到文件的方法 这不可能吗 我的意思是 PyYAML 库有一个 转储 功能 yaml cpp中没有这样的功能吗 是否有一
  • Xcode 4.4 - 存在内部 API 错误

    您好 我刚刚升级到 Mountain Lion 我创建了一个空的单视图应用程序并运行它 第一次运行良好 但接下来的运行会给我 有一个内部 API错误 弹出警告两次 这与我的其他项目相同 它们一次运行正常 但在下一次运行时出现此错误 没有任何
  • PHP 会话变量足以进行用户身份验证吗?

    设想 用户登录后 将设置一个会话变量来确认其登录 在每个页面的顶部 登录会话变量被确认有效 如果不是 他们就会被踢出局 不使用持久性 cookie 仅使用session 问题 这是一个足够强大的安全措施本身 还是我应该 设置两个会话变量以验
  • 参考错误:未使用 nextjs 定义导航器

    我的代码是这样的 从 react 导入 React useEffect import alanBtn from alan ai alan sdk web const alanKey my key const App gt useEffect
  • UIScrollView 内的动态 UILabel 内容

    我有一个 UILabel 以及其他控件 存储在 UIScrollView 中 我想动态填充 UILabel 以便它自动扩展其高度以适应其内容 我只是想知道调整 UILabel 大小同时确保其父 UIScrollView 也将扩展其可滚动区域
  • Symfony2/FOSUserBundle - 多个捆绑包的路由问题

    如同this https stackoverflow com q 9826370 399584问题 我需要为我的网站的管理和前端包单独登录 管理实际上是一个单独的包 位于vendors 现在 我的路由如下所示 应用程序 配置 路由 yml
  • MVVMCross Binding 导致 Android 应用程序崩溃

    我有一个基于 Xamarin 和 MvvmCross 的 Android 应用程序 在该应用程序中 有一个带有我自己创建的 ExpandableListView 的视图 现在 此列表显示几个项目 这些项目使用 MvvmCross 绑定到其