2012-09-26 21 views
1

我有一個Mono for Android項目,可以使用以下代碼成功編譯和運行。然而,複製/粘貼到我正在處理的較新項目中會導致編譯器錯誤,指示:[appnamespace] .Android.Resource.Layout不包含'SimpleListItem2'的定義。如何讓谷歌在我的Mono for Android項目中提供Android.Resource.Layout引用

如果我試圖訪問我定義的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; 
} 

基本上,我正在尋找能夠訪問在Mono.Android組裝這些佈局中,Android.Resource.Layout命名空間下:

ActivityListItem
BrowserLInkContextHeader
ExpandableListContent
PreferenceCategory
SelectDialogItem
SelectDialogMultiChoice
SelectDialogSingleChoice
SimpleDropDownItem1Line
SimpleExpandableListItem1
SimpleExpandableListItem2
SimpleGalleryItem
SimpleListItem1
SimpleListItem2
SimpleListItemChecked
SimpleListItemMultipleChoice
SimpleListItemSingleChoice
SimpleListItemDropDownItem
SimpleSpinnerItem
TestListItem
TwoLineListItem

回答

7

似乎命名空間衝突會導致此錯誤。在您的名字空間中使用「Android」時會被警告。

如果應用程序的名稱空間包含「Android」,Xamarin的Android編譯器似乎很難解決Google的SimpleListItem2對象。

要體驗錯誤,「Android」字符串需要是名稱空間中的完整字符串(不是子字符串)。命名空間「BenHorgen.Android.MyApps.TestApp」導致編譯器錯誤。

更具體地說,在命名空間中包含字符串「Android」作爲子字符串將導致該問題而不是。例如:「BenHorgen.MyAndroidApps.TestApp」不會導致我的問題。

+1

同樣在這裏效力。你提交了一個錯誤或什麼? –

+0

確保沒有其他項目(共享/庫)在其名稱空間中使用android。例如,我使用XYZ.Common.Android作爲通用庫的名稱... OOOOPS。 –

+0

我沒有提交錯誤,因爲它似乎是.NET編譯器/預處理器的有效行爲。編譯器將基於命名空間假定範圍。如果項目要求在名稱空間中使用「Android」,則可以通過完全限定Google Android SDK中所有對象的名稱空間來克服編譯器異常。 – benhorgen

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.18名稱空間並輸入C# Language Specification的頁面名稱,第100-102頁。

  • 否則,名稱空間或類型名稱的形式N.I的或形式的N.I<A1, ..., AK>N首先被解析爲命名空間或類型名稱

在這種情況下,我們正在處理System.Object,這是形式N.I的。所以 我們需要首先解決System

  • 否則,如果命名空間或類型名稱的形式I或形式I<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 System; 
using MyObject = System.Object; 

namespace Example { 
    namespace System { 
    } 

    class Bad : MyObject { 
    } 
} 
+0

'global :: Android.Resource.Layout' < - 優秀的解決方案,有詳細的解釋。希望我能超過1。 –

相關問題