1

我有一个 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

4

2 回答 2

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 编译器都是如此。

为什么?请参阅C# 语言规范的 §10.8 命名空间和类型名称,第 100-102 页。

  • 否则,namespace-or-type-name的格式为N.IN.I<A1, ..., AK>N首先被解析为namespace-or-type-name

在这种情况下,我们正在处理System.Object,其形式为N.I。所以我们需要先解决System

  • 否则,如果namespace-or-type-name的形式II<A1, ..., AK>:
    ...
    • 否则,对于每个命名空间 N,从出现命名空间或类型名称的命名空间开始,继续每个封闭命名空间(如果有),并以全局命名空间结束,评估以下步骤,直到找到实体: ...

这会将令牌解析SystemExample.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 {
    }
}
于 2013-05-30T14:16:16.183 回答
7

似乎命名空间冲突会导致此错误。在命名空间中使用“Android”时会收到警告。

如果应用程序的命名空间包含“Android”,Xamarin 的 Mono for Android 编译器似乎很难解析 Google 的 SimpleListItem2 对象。

要遇到错误,“Android”字符串需要是命名空间中的完整字符串(而不是子字符串)。命名空间“BenHorgen.Android.MyApps.TestApp”导致编译器错误。

更具体地说,在命名空间中包含字符串“Android”作为子字符串不会导致问题。例如:“BenHorgen.MyAndroidApps.TestApp”不会对我造成问题。

于 2012-10-13T17:15:22.957 回答