我是Xamarin的新手,但需要创建一个Android应用,所以现在是时候学习了。
我听说MvvmCross,并认为这将是一个很好的补充,因为它似乎简化了一些事情。
我创建了一个基本的应用程序,有一个文本框来显示,那种事情。
然后我尝试使用Dilbert示例添加列表视图。
当我尝试使用MvxListItemView
运行视图时protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
SetContentView(Resource.Layout.ProcessFormView);
}
我收到此错误。
System.NotSupportedException:无法找到构造函数 签名(Android.Content.Context,Android.Util.IAttributeSet)上 键入MvvmCross.Binding.Droid.Views.MvxListItemView。请提供 缺少的构造函数。
从我所看到的构造函数是
public MvxListItemView(Context context, IMvxLayoutInflaterHolder layoutInflaterHolder, object dataContext, int templateId);
我在我和演示中找不到任何明显的差异。
是否有我遗漏或可能被忽视的事情?
ProcessFormView.axml:
<?xml version="1.0" encoding="utf-8"?>
<Mvx.MvxListView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:local="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
local:MvxBind="ItemsSource Form"
local:MvxItemTemplate="@layout/FormItem" />
FormItem.axml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:local="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="40dp"
android:text="Form Item" />
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="40dp"
local:MvxBind="Text Field" />
</LinearLayout>
答案 0 :(得分:2)
在我看来,好像Android无法找到它正在寻找的MvxListItemView
构造函数,因为它正在搜索错误的程序集。您在布局中使用Mvx.MvxListView
,但这是一个快捷方式,需要您在Setup
类中注册命名空间缩写。有三种方法可以解决问题:
选项1:AndroidViewAssemblies
将布局中的Mvx.MvxListView
更改为MvxListView
。然后,您需要向Android提供用于查找MvxListView
的程序集,这可以通过AndroidViewAssemblies
中的Setup
覆盖来完成:
protected override IEnumerable<Assembly> AndroidViewAssemblies
=> new List<Assembly>(base.AndroidViewAssemblies)
{
typeof(MvvmCross.Binding.Droid.Views.MvxListView).Assembly,
typeof(MvvmCross.Binding.Droid.Views.MvxListItemView).Assembly
};
这是一个更干净的选择,也是我亲自参与的选择。请注意,您需要对应用程序中的每个Mvx控件执行相同的两个步骤:从布局中删除命名空间,并注册它的程序集。
选项2:ViewNamespaceAbbreviations
此选项告诉Android Mvx.MvxListView
实际上意味着MvvmCross.Binding.Droid.Views.MvxListItemView
,并且还通过Setup
中的覆盖来实现:
protected override IDictionary<string, string> ViewNamespaceAbbreviations
=> new Dictionary<string, string>
{
{
"Mvx", "MvvmCross.Binding.Droid.Views"
}
};
如果您决定选项2,请务必保持布局不变(即仍然使用Mvx.MvxListView
)。
选项3:懒惰
解决此问题的最简单方法是通过将Mvx.MvxListView
更改为MvvmCross.Binding.Droid.Views.MvxListView
来完全限定布局中的命名空间。这里的缺点是你需要完全限定你使用的每个MvvmCross控件,这是尴尬和混乱。