2016-11-09 108 views
-1

我真的有問題解決此問題。對象引用是必需的非靜態字段,方法或屬性'MainPage.readOut'

'HandleNewTag'方法在Droid MainActivity類中。這是一個非靜態的,但抱怨它調用的'MainPage.HandleNFC'方法,所以我將它改爲static,並且沒有錯誤。

'MainPage.HandleNFC'方法也調用非靜態方法。我將其更改爲靜態無效以阻止錯誤。然後在那個方法中,它設置了XAML控件的一些屬性,它抱怨控件不是靜態的,我無法改變。

我在互聯網上搜索高和低來解決這個問題,雖然我可以找到類似的錯誤,但他們都沒有提到非靜態控制問題。

MainActivity.cs

public void HandleNewTag(object sender, NfcFormsTag e) 
{ 
    //MainPage mp = new MainPage(); 

    byte[] bytes = e.Id; 
    Console.WriteLine(BitConverter.ToString(bytes)); 

    if (BitConverter.IsLittleEndian) 
     Array.Reverse(bytes); 

    Console.WriteLine(BitConverter.ToString(bytes)); 
    // Call method to send byte stream across machine boundaries. 

    // Receive byte stream from beyond machine boundaries. 
    Console.WriteLine(BitConverter.ToString(bytes)); 
    if (BitConverter.IsLittleEndian) 
     Array.Reverse(bytes); 

    Console.WriteLine(BitConverter.ToString(bytes)); 
    int result = BitConverter.ToInt32(bytes, 0); 



    MainPage.HandleNFC(result.ToString()); 
} 

MainPage.xaml中

public static void HandleNFC(string convertedtag) 
{  
    addToReadout(convertedtag); 
} 

public static void addToReadout(string text) 
{ 
    Label label1 = new Label { Text = "Successfully clocked out @ " + text, TextColor = Color.Black }; 
    StackLayout sl = new StackLayout(); 



    readOut.Children.Add(label1); 
    readOut.BackgroundColor = Color.Black; 
    readOut.Children.Count(); 
} 
+0

這聽起來像你開始時通過只是在'static'關鍵字扔在這裏和那裏只是爲了讓錯誤消失工作。這是錯誤的做法。 *應該*這些方法首先是「靜態」的? – David

+0

是的你是對的,但是如果沒有他們,它根本就行不通。第一種方法(Droid中的HandleNewTag)似乎不是靜態的,但它抱怨它調用的方法(MainPage.HandleNFC)不是靜態的。 – connersz

+0

也許它需要一個* MainPage'實例來調用'.HandleNFC()'在那個實例上?目前,您正試圖將該方法稱爲靜態。使*一切*靜態來解決編譯器錯誤聽起來不理想。 – David

回答

0

有些事情錯在這裏。你爲什麼要從Xamarin.Android MainActivity調用你的Forms MainPage(住在PCL或共享項目中)?這裏的依賴流向後。我還假設「MainPage.xaml」是「MainPage.xaml.cs」,因爲您顯示的是C#代碼而不是XAML。

無論哪種方式,它看起來像你想添加標籤到你的MainPage上的控件。生活在MainActivity.cs中的HandleNewTag事件處理程序可能不應該這樣工作,因爲當您必須考慮其他平臺時,解決方案會變得複雜。通常,您希望將呼叫從PCL分流到特定於平臺的項目,如Xamarin.Forms.DependencyService所做的(基本容器/ IoC模式)。

我知道,在Android上NFC功能需要應用程序或活動環境來執行操作,並且您收到的NFC讀數將通過您的MainActivity進入。處理這種情況的一種方法是將Xamarin.Forms內置到MessagingCenter中。它只是爲此目的而設計的,因爲那樣你也可以通過你的iOS或UWP項目的消息中心發送消息,並且一切都可以正常工作。您將擁有一個位於MainPage.xaml.cs中的MessagingCenter訂閱,我通常會使用該東西的構造函數。

另一種選擇是創建一個「AppViewModel」,它位於應用程序的頂層。我通常在我的App類中創建這個靜態變量,所以我可以通過調用App.ViewModel(無論)從任何地方引用它。您的挑戰將是採取這些數據並更新您的用戶界面。我會通過將控件直接綁定到該靜態實例中的源代碼並創建一個利用OnPropertyChanged更新綁定的「刷新」機制來實現此目的。這當然是一個更復雜的解決方案,並且完全是圍繞您正在嘗試完成的任務而構建/設計的。

我希望這有助於!

披露:我對Xamarin /微軟

相關問題