【问题标题】:Xamarin Monodroid: WP7 => Android and Custom Control?Xamarin Monodroid:WP7 => Android 和自定义控件?
【发布时间】: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 实现类似的功能?

提前致谢!

【问题讨论】:

    标签: c# xamarin.android custom-view xamarin


    【解决方案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_width="fill_parent"
        android:layout_height="fill_parent"
        />
    

    【讨论】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-16
      • 2018-10-21
      • 2017-08-23
      • 2014-03-08
      • 1970-01-01
      • 2020-05-29
      • 1970-01-01
      相关资源
      最近更新 更多