我有一个Mono for Android项目,使用以下代码编译并成功运行。但是,复制/粘贴到我正在处理的新项目中会导致编译器错误,指示:[appnamespace] .Android.Resource.Layout不包含'SimpleListItem2'的定义。
如果我试图访问我定义的xml资源布局,我会发现错误,但我正在尝试访问Google提供的默认资源布局,特别是'SimpleListItem2'。有什么我需要做的让编译器识别默认布局?谢谢!
public override View GetView(int position, View convertView, ViewGroup parent)
{
View v = convertView;
if (v == null) {
LayoutInflater li = (LayoutInflater)this.Context.GetSystemService(Context.LayoutInflaterService);
v = li.Inflate(Android.Resource.Layout.SimpleListItem2, null);
}
TextView tt = (TextView)v.FindViewById(Android.Resource.Id.Text1);
if (tt != null) { tt.Text = string.Format("{0}, {1}", this.LastName, this.FirstName); }
return v;
}
基本上,我正在寻找在Android.Resource.Layout名称空间下的Mono.Android程序集中访问这些布局:
ActivityListItem
BrowserLInkContextHeader
ExpandableListContent
PreferenceCategory
SelectDialogItem
SelectDialogMultiChoice
SelectDialogSingleChoice
SimpleDropDownItem1Line
SimpleExpandableListItem1
SimpleExpandableListItem2
SimpleGalleryItem
SimpleListItem1
SimpleListItem2
SimpleListItemChecked
SimpleListItemMultipleChoice
SimpleListItemSingleChoice
SimpleListItemDropDownItem
SimpleSpinnerItem
TestListItem
TwoLineListItem
答案 0 :(得分:9)
这是一种C#语言功能,其行为符合C#语言规范。
考虑这个例子:
using System;
namespace Example {
namespace System {
}
class Bad : System.Object {
}
}
以上编译失败:
ns.cs(8,24): error CS0234: The type or namespace name `Object' does not exist in
the namespace `Example.System'. Are you missing an assembly reference?
对于.NET CSC和Mono的mcs编译器都是如此。
为什么呢?请参见§10.8命名空间和类型名称C# Language Specification,第100-102页。
- 否则, namespace-or-type-name 的格式为
N.I
或N.I<A1, ..., AK>
格式。N
首先被解析为 namespace-or-type-name 。
在这种情况下,我们正在处理System.Object
,其形式为N.I
。所以
我们需要先解决System
:
- 否则,如果 namespace-or-type-name 的格式为
I
或I<A1, ..., AK>
格式: ...
- 否则,对于每个命名空间N,从其中的命名空间开始 发生namespace-or-type-name,继续使用每个封闭的命名空间 (如果有),并以全局命名空间结束,将评估以下步骤 直到找到实体: ...
这会将令牌System
解析为Example.System
。现在System
是
解决了编译器尝试解析System.Object
,即完全解析的问题
合格的Example.System.Object
名称。这种类型不存在,我们得到
错误。
以上样本的修复?使用global::
:
class Bad : global::System.Object {
}
您的Android代码也是如此;如果你碰巧在一个
Example.Android
命名空间,您需要使用Android.Resource.Layout
输入,然后使用global::Android.Resource.Layout
。
或者您可以使用 using-alias ,它在声明点解析,允许:
using System;
using MyObject = System.Object;
namespace Example {
namespace System {
}
class Bad : MyObject {
}
}
答案 1 :(得分:7)
似乎命名空间冲突导致此错误。在命名空间中使用“Android”时会收到警告。
如果应用程序的名称空间包含“Android”,则Xamarin的Mono for Android编译器似乎很难解析Google的SimpleListItem2对象。
要体验错误,“Android”字符串必须是命名空间中的完整字符串(不是子字符串)。命名空间“BenHorgen.Android.MyApps.TestApp”将导致编译器错误。
更具体地说,在命名空间中包含字符串“Android”作为子字符串将不导致问题。例如:“BenHorgen.MyAndroidApps.TestApp”不会对我造成问题。