Xamarin Monodroid: WP7 => Android и пользовательский элемент управления?

я нахожусь в процессе переноса некоторых из моих приложений Windows Phone на Android с помощью Xamarin Monodroid.

Я новичок в Xamarin, только что купил лицензию.

Пока что все хорошо, что воссоздает пользовательский интерфейс XAML в AXML, но я столкнулся с проблемой с пользовательскими элементами управления.

Вот что я имею в виду под пользовательскими элементами управления:

В .NET я создал набор элементов управления, создав класс, наследуемый от класса «UserControl», я создал логику и установил содержимое. Затем я просто создаю новый экземпляр с помощью «new my_control()» и т. д.

Некоторые из моих элементов управления не создаются таким образом, но вместо этого я создал UserControl, определив XAML, где нет конкретной логики, но когда мне нужно объединить 2 или более элементов управления (например, цветной квадрат с текстом рядом с ним, поэтому Rectangle + TextBlock) и снова мне просто нужно сделать «new my_control()» и добавить его где-нибудь в пользовательском интерфейсе XAML (Grid, ListBox, StackPanel и т. д.).

Как я могу добиться чего-то подобного с Monodroid?

Заранее спасибо!


person Armkreuz    schedule 18.06.2012    source источник


Ответы (3)


Вы также можете создавать «настраиваемые элементы управления» в Mono для 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"
    />
person Stuart    schedule 18.06.2012
comment
Что делать, если я не хочу добавлять его в axml, а вместо этого программно заполнять список? - person Armkreuz; 20.06.2012
comment
Вы можете легко создавать пользовательские представления в своем адаптере, но здесь сложно добавить примеры кода в комментарии. Все, что вы делаете в XML, также можно легко сделать в коде — представления можно обновлять и добавлять в контейнеры (группы представлений). - person Stuart; 20.06.2012

Вы можете создать свое собственное представление, унаследовав класс View. Это позволяет делать что угодно. Затем вы можете сослаться на него в своем AXML с помощью:

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

Просто убедитесь, что ваше имя пространства имен в AXML написано строчными буквами, иначе оно не будет распознано.

Но если вам просто нужен очень простой макет AXML, который вы собираетесь часто использовать, вы можете создать новый файл AXML и использовать тег include, чтобы поместить его туда.

Здесь есть более общая информация о некоторых хитростях макета для Android, которые также будут работать для Mono для Android: https://developer.android.com/resources/articles/layout-tricks-merge.html

person Cheesebaron    schedule 18.06.2012
comment
+1 за Просто убедитесь, что ваше имя пространства имен в AXML написано строчными буквами, иначе оно не будет распознано - person PCoder; 05.12.2012

Любая причина, по которой он не войдет в конструктор? Вот мой конструктор:

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

    }

Метод Init вызывает циклическую зависимость, когда я раздуваю XML-файлcrop_image_view.

Я пробовал с общедоступным, частным, но не повезло... вот мой код: https://github.com/slown1/Xamarin.CircleImageCropper

person Demian Flavius    schedule 15.08.2014