Question

i am in the process of porting some of my Windows Phone Applications to Android using Xamarin Monodroid.

I am pretty new with the Xamarin stuff, just bought a license actually.

So far so good as far as recreating the XAML UI in AXML but i am facing a problem with Custom Controls.

Here is what i mean by custom controls:

In .NET, i created a bunch of controls by creating class that inherit from the 'UserControl' class, i created the logic and set the Content. Then i just create new instance with 'new my_control()', etc...

Some of my controls are not created this way but instead i created the UserControl by defining the XAML, where there is no specific logics but when i need to combine 2 or more controls(for example, a colored square with text beside it, so Rectangle + TextBlock) and again i just need to do 'new my_control()' and add it somewhere in the XAML UI(Grid, ListBox, StackPanel, etc...).

How can i achieve something similar with Monodroid?

Thanks in advance!

Was it helpful?

Solution

You can do "custom controls" in Mono for Android too - and once you've written them, then you can include them in your axml files.

I'm afraid I don't have any perfectly simple examples to hand, but there's a complicated example in:

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

If you declare a class MyControl in MyNamespace and inherit that control from an Android View and you can then setup your custom control - including pulling in attributes from the XML - using a constructor like:

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

and using XML like:

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

One example of this could be the control from https://github.com/Cheesebaron/MonoDroid.HorizontalPager - which could be used from xml using xml like

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

OTHER TIPS

You can make your own custom view by inheriting the View class. This allows you to do anything. Then you can reference it in your AXML with:

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

Just make sure your namespace name in the AXML is all lower case, otherwise it won't pick it up.

But if you just need a very simple AXML layout that you are going to use a lot, you can create a new AXML file and use the include tag to put it in there.

There is some more general info on some Layout Tricks for Android which will work for Mono for Android as well here: https://developer.android.com/resources/articles/layout-tricks-merge.html

Any reason why it won't enter the constructor? Here is my constructor:

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

    }

The Init method causes the circular dependency when I inflate the crop_image_view xml

I have tried with public, private but no luck... here is my code: https://github.com/slown1/Xamarin.CircleImageCropper

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top