如何在我的Mono for Android项目中获取Google提供的Android.Resource.Layout引用

时间:2012-09-26 17:22:40

标签: c# android xamarin.android

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

2 个答案:

答案 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.IN.I<A1, ..., AK>格式。   N首先被解析为 namespace-or-type-name
  •   

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

  
      
  • 否则,如果 namespace-or-type-name 的格式为II<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”不会对我造成问题。