Xamarin Monodroid:WP7 => Android 和自定义控件?

Posted

技术标签:

【中文标题】Xamarin Monodroid:WP7 => Android 和自定义控件?【英文标题】:Xamarin Monodroid: WP7 => Android and Custom Control? 【发布时间】:2012-06-20 22:08:19 【问题描述】:

我正在使用 Xamarin Monodroid 将我的一些 Windows Phone 应用程序移植到 android

我对 Xamarin 的东西还很陌生,实际上只是买了一个许可证。

到目前为止,就在 AXML 中重新创建 XAML UI 而言一切都很好,但我遇到了自定义控件的问题。

这就是我所说的自定义控件:

在 .NET 中,我通过创建从“UserControl”类继承的类创建了一堆控件,我创建了逻辑并设置了内容。然后我只是用'new my_control()'等创建新实例......

我的一些控件不是以这种方式创建的,而是我通过定义 XAML 创建了 UserControl,其中没有特定的逻辑,但是当我需要组合 2 个或更多控件时(例如,旁边带有文本的彩色方块, 所以 Rectangle + TextBlock) 并且我只需要执行 'new my_control()' 并将其添加到 XAML UI 中的某处(Grid、ListBox、StackPanel 等...)。

如何使用 Monodroid 实现类似的功能?

提前致谢!

【问题讨论】:

【参考方案1】:

您可以通过继承 View 类来制作自己的自定义视图。这使您可以做任何事情。然后你可以在你的 AXML 中引用它:

<your.awesome.namespace.AwesomeViewName
  android:id="@+id/awesomeView"
  android:layout...
  />

只要确保你在 AXML 中的命名空间名称都是小写的,否则它不会提取它。

但是如果你只需要一个非常简单的 AXML 布局并且你会经常使用,你可以创建一个新的 AXML 文件并使用 include 标签将它放在那里。

这里有一些关于 Android 布局技巧的更一般信息,这些技巧也适用于 Android 的 Mono:https://developer.android.com/resources/articles/layout-tricks-merge.html

【讨论】:

+1 for 只要确保你在 AXML 中的命名空间名称都是小写的,否则它不会提取它【参考方案2】:

您也可以在 Mono for Android 中执行“自定义控件” - 一旦您编写了它们,就可以将它们包含在您的 axml 文件中。

恐怕我手头没有任何完全简单的例子,但有一个复杂的例子:

https://github.com/slodge/MvvmCross/blob/master/Sample%20-%20CirriousConference/Cirrious.Conference.UI.Droid/Resources/Layout/ChildPage_Twitter.axml

如果您在 MyNamespace 中声明类 MyControl 并从 Android View 继承该控件,然后您可以设置自定义控件 - 包括从 XML 中提取属性 - 使用如下构造函数:

public MyControl(Context context, IAttributeSet attrs)  /* ... */ 

并使用类似的 XML:

<mynamespace.MyControl android:layout_height='wrap_content' />

这方面的一个例子可能是来自https://github.com/Cheesebaron/MonoDroid.HorizontalPager 的控件 - 它可以从 xml 中使用 xml like

 <mynamespace.controls.HorizontalPager
    android:id="@+id/MyPageHost"
    android:layout_
    android:layout_
    />

【讨论】:

如果我不想将其添加到 axml 中而是以编程方式填充列表视图,该怎么办? 您可以在适配器中轻松创建自定义视图 - 但在这里很难在 cmets 中添加代码示例。您在 XML 中所做的任何事情也可以在代码中轻松完成 - 可以新建视图并将其添加到容器(视图组)【参考方案3】:

它不会进入构造函数的任何原因?这是我的构造函数:

protected CropImageView(IntPtr javaReference, JniHandleOwnership transfer)
        : base(javaReference, transfer)
    

    

当我对crop_image_view xml进行膨胀时,Init方法会导致循环依赖

我尝试过公开、私有但没有运气...这是我的代码:https://github.com/slown1/Xamarin.CircleImageCropper

【讨论】:

以上是关于Xamarin Monodroid:WP7 => Android 和自定义控件?的主要内容,如果未能解决你的问题,请参考以下文章

使 PCL Xamarin (MonoDroid/MonoTouch) 兼容的问题

适用于 Xamarin.Android 的便携式裁剪图像活动(Android 的 Monodroid / Mono)

Monodroid 和 adMob 插页式广告

Monodroid 和 adMob 插页式广告

在 monotouch/monodroid 中使用 mocks 进行单元测试

如何在 MonoDroid 的代码隐藏中设置边距?