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

时间:2012-06-18 21:24:29

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

我正在使用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类似的东西?

提前致谢!

3 个答案:

答案 0 :(得分:6)

您可以通过继承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 :(得分:2)

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

我担心我手边没有任何简单的例子,但是有一个复杂的例子:

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

如果您在MyControl中声明了一个类MyNamespace并从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,如

 <mynamespace.controls.HorizontalPager
    android:id="@+id/MyPageHost"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    />

答案 2 :(得分:0)

为什么它不会进入构造函数?这是我的构造函数:

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

    }

当我给crop_image_view xml

充气时,Init方法会导致循环依赖

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