2014-09-05 34 views
11

我想在我的原生Android頁面控件中使用Xamarin.Form控件。在我的Android本地頁面中,是否有任何方法在我的Native Android Fragment或LinearLayout中加載Xamarin.Form頁面?如何使用Xamarin.Form控件和本機控件在同一頁

根據Xamarin這是可能的。但我無法找到如何實現這一點。

http://xamarin.com/forms

+0

有一種方法破解這在任何人的情況下仍然需要。非常多的黑客攻擊,涉及反編譯和複製Xamarin.Forms框架中的幾個類,是由我的同事開發的,並在他的博客文章中描述過(http://www.arturdr.ru/android/xamarin-forms- I-slozhnosti-integratsii-v-機器人-prilozheniya /)。不幸的是,這篇文章是用俄語編寫的,但非常適合谷歌翻譯,並且您不需要閱讀任何內容來複制代碼或下載示例(請參閱下面的代碼.zip)。 – 2015-01-28 08:38:00

+0

一個需要注意的就是始終使用.dispose()視圖,從受到攻擊的inflater中獲得 - 內存管理通常由Xamarin.Forms完成,並且不在外部工作。 – 2015-01-28 08:41:38

+0

這仍然不可能嗎? – Curiousity 2017-07-07 04:03:28

回答

9

有正在討論的幾件事情,我是如此的裸: -

的圖像片段,從我的理解: -

"Not only are Xamarin.Forms pages mixable with custom screens" ... 

這就像@Stephane提到允許應用程序使用本機屏幕以及作爲Xamarin.Forms屏幕。每個平臺存根頁面可以在應用程序中的任何點處引入共享的Xamarin.Forms頁面。您不必使用Xamarin.Forms導航堆棧

"but you can embed custom views built directly against Xamarin.IOS and Xamarin.Android into Xamarin.Forms pages." 

這是@Sten提的是,在這裏,如果你創建平臺的具體ContentRenderers可以使任何類型的本地控制到現有Xamarin.Forms頁面,通過傳遞這個常見的查看給每個平臺渲染器。

所以,舉例來說,如果你有一個查看: -

public class MyView : ContentView 
{ 
    // Create some bindable properties here that can be used in your platform specific renderer, 
    // i.e. DisplayText etc. 
} 

您可以用上面的Xamarin.Forms頁面定義,然後創建平臺特定呈現那被稱爲以呈現內容

從這些平臺的具體內容渲染器類,你可以在每個平臺上使用本地控制內。

例如在ContentRenderer,該事件OnElementChanged你可以做類似的以下的WindowsPhone: -

protected override void OnElementChanged(Xamarin.Forms.Platform.WinPhone.ElementChangedEventArgs<MyView> e) 
{ 
    base.onElementChanged(e); 
    ... 
    System.Windows.Controls.TextBox objPlatformSpecificTextBox = new System.Windows.Controls.TextBox(); 
    ... 
    ... 

然而,什麼@Gulshan真的想要我相信是有本地頁面中心階段Xamarin.Forms正在呈現的內容轉化爲特定點,已經存在的本地頁面

它有點顛倒,在思考,但是這仍然是可能的: -

要做到這一點,你需要刺激頁面代入一個臨時新的一頁。

例如在的WindowsPhone你會通過這樣做: -

 PhoneApplicationPage objInnerPage_Temp = new PhoneApplicationPage(); 
     UIElement objInnerContent = App.GetMainPage().ConvertPageToUIElement(objInnerPage_Temp); 
平臺特定的存根頁面上

然後,您可以注入所呈現的內容爲機容器是合適的平臺上,即一個電網

更新1: -

==========

雖然它很容易做到這一點的WindowsPhone的它似乎並不認爲這是可能的當嘗試類似的Android不幸的。

的Android網頁製作非常鎖定,即你不能私人領域獲得准入帆布和/或佈局,它在內部AndroidActivity使用。

如果這是可能的,那麼你可以重新使用,並採取呈現的內容和注入類似於對WindowsPhone的平臺的解決方案。

此外,平臺類被標記爲內部也,防止另一種方式來產生所呈現的內容。

人們希望我是從從片段實施產生活動到它的接近這一思想,這可能很好地工作 - 然而 - 這裏的問題是,在Xamarin.Forms實施正期望ActionBar可用,但它不是,並且如果爲空方案,它們不檢查如果它不可用,則允許繼續執行,因此它會引發異常,從而阻止頁面內容生成。

它並不因此看起來可能?除非他們AndroidActivity開拓佈局/帆布字段或解決動作條預期的問題。

+0

是的,我知道自定義渲染器。但是使用渲染器,我想我只能在Xamarin.Forms頁面中使用本地控件。但我的要求完全相反。我想在一些Native控件中使用xamarin.Forms頁面。如果您查看已使用Xamarin.Forms頁面的Activity,則有一個方法「SetContentPage()」,它將XamarinForms頁面作爲輸入將其設置爲整個活動。我正在尋找的是,我可以在佈局或Fragement中設置我的XamarinForm頁面或控件的方式。或者,如果我可以將Xamarin.Forms.View轉換爲Android.Views.View。 – Gulshan 2014-09-08 04:05:20

+0

我答案的最後部分確實突出了我相信你的真實意圖,並提出了一種方法。它可能通過** WindowsPhone **很容易,但是** Android **被鎖定。我已更新我的答案以反映新的發現(請參閱*更新1 *)。你在哪看到* SetContentPage()*爲* Android *,因爲我似乎無法找到這種方法? – Pete 2014-09-08 17:21:10

+0

非常真實。我實際上在Android中尋找類似於Windows Phone中的「ConvertPageToUIElement」的方法。我已經提取了AndroidActivity的代碼。你說得對,平臺類被標記爲內部。所以現在可能是不可能的。 – Gulshan 2014-09-10 08:11:31

0

您可以創建一個由Xamarin.Forms支持由Xamarin.Forms.Platform.Android.AndroidActivity繼承了新Activity和另一位在你的應用程序Xamarin.Android推出這一新的活動。

+0

是的,我知道。問題是Xamarin.Forms.Platform.Android.AndroidActivity只有一個方法SetPage(Xamarin.Forms.Page頁面)全屏顯示Xamarin.Forms頁面。我想要的是,在我的Activity上,我有很多其他原生Android控件。在這些控件之間我想用我的一個Xamarin.Forms頁面或視圖。 – Gulshan 2014-09-05 12:16:00

1

您可能正在尋找自定義渲染器。

  • 在你的窗體項目創建一個類MyView的,從View繼承(或其他合適的班級,說內容查看,如果你有孩子的意見等)
  • 在你的Android項目創建一個渲染器類MyViewRenderer繼承ViewRenderer
  • 添加屬性到類,它指示它是一個渲染之前命名空間聲明 [assembly: ExportRenderer (typeof(MyView), typeof(MyViewRenderer))]
  • 在MyViewRenderer覆蓋OnElementChanged,調用base.SetNativeView(ctl)這裏CTL是你的本地控制

的實例,以在Xamarin's Forums看看Xamarin's guide

另一個資源。

看過這個問題並實現我自己的邊框後,我會說VisualElementRenderer<TElement>是一個更好的渲染器。如果您使用所有您需要做的就是重寫OnElementChanged並執行NativeView.Add(customUIView)並從MyView實例複製屬性。爲了處理這些屬性的動態變化覆蓋OnElementPropertyChanged和更新customUIView實例

+0

是的,我知道自定義渲染器。但是使用渲染器,我想我只能在Xamarin.Forms頁面中使用本地控件。但我的要求完全相反。我想在一些Native控件中使用xamarin.Forms頁面。如果您查看已使用Xamarin.Forms頁面的Activity,則有一個方法「SetContentPage()」,它將XamarinForms頁面作爲輸入將其設置爲整個活動。我正在尋找的是,我可以在佈局或Fragement中設置我的XamarinForm頁面或控件的方式。或者,如果我可以將Xamarin.Forms.View轉換爲Android.Views.View。 – Gulshan 2014-09-08 04:09:03

+0

如何在自定義渲染器中保存本地控件的Forms頁面以及可以將其視圖作爲本地子視圖移動的NativeChild自定義渲染器?我不認爲這是完全可以在一個完全原生的應用程序中實現的 – 2014-09-08 13:53:56

+0

它可能在** WindowsPhone **中,但是** Android **太鎖定了它的出現。我目前還沒有在** iOS **上測試過這個。 – Pete 2014-09-08 18:25:27

1

Xamarin修改了它的網站,所以上面的圖片已經過時了。隨着Xamarin.Forms庫的發展,似乎混合Xamarin.Forms和特定於平臺的本地視圖變得更加困難。我不會推薦這樣做。高級用戶當然可以嘗試這種方式,但是我與其他開發人員的對話表明這會產生大量額外的工作和開銷。最好的路徑是使用Xamarin.Forms專門爲您的觀點,或使用特定於平臺的本機視圖。

下面是Xamarin的Xamarin.Forms頁(拍攝於2015年5月13日拍攝)截圖:

enter image description here

相關問題