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

ben*_*gen 1 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;
}
Run Code Online (Sandbox Code Playgroud)

基本上,我正在寻找在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

jon*_*onp 9

这是一种C#语言功能,其行为符合C#语言规范.

考虑这个例子:

using System;

namespace Example {
    namespace System {
    }

    class Bad : System.Object {
    }
}
Run Code Online (Sandbox Code Playgroud)

以上无法编译:

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?
Run Code Online (Sandbox Code Playgroud)

对于.NET CSC和Mono的mcs编译器都是如此.

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

  • 否则,namespace-or-type-name的形式N.I或形式N.I<A1, ..., AK>. N首先解析为名称空间或类型名称.

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

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

这会将令牌解析SystemExample.System.现在System已解决,编译器尝试解析System.Object,即完全限定名称Example.System.Object.此类型不存在,我们收到错误.

以上样本的修复?用途global:::

class Bad : global::System.Object {
}
Run Code Online (Sandbox Code Playgroud)

您的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 {
    }
}
Run Code Online (Sandbox Code Playgroud)


ben*_*gen 7

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

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

要体验错误,"Android"字符串需要是命名空间中的完整字符串(不是子字符串).命名空间"BenHorgen.Android.MyApps.TestApp" 导致编译器错误.

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