Разработка приложений для Android с C#

Monodroid и Monotouch это фреймворки от xamarin, которые дают возможность разрабатывать приложение на языке C# для Android и iOS соответственно. Так как это относительно новая технология информации в интернете не слишком много (за исключением офф сайта и большого количества тем на stackoverflow.com), на русском языке же я не нашел никаких туториалов и информации вообще.

Что бы устранить это недоразумение решил написать небольшой туториал о том как начать разрабатывать приложения под мобильные платформы при помощи этих фреймворков. В этой статье я рассмотрю только Monodroid.

image


Что нужно для начала разработки?
1) Visual studio C# версии professional и выше (пойдет и крякнутая)
2) Сам фреймворк (а он, в свою очередь установит за нас и джаву, и виртуальную машину и все остальное)

Если с первым все понятно, то со вторым сложнее- как оказалось в процессе использования фришная версия монодроида не умеет компилировать .apk файлы, так что стоит либо его купить, либо воспользоваться кряком из интернета (который лежит далеко не на первой странице гугла).

Начнем

Запустив после установки всего необходимого студию мы заметим новые типы проектов для создания:


Выбираем Android Application. Будет создано несколько стандартных директорий:


В папке Assets хранятся все используемые программой файлы аля видео, звуков, хтмл файлов и т.д. Изначально в ней ничего нет кроме текстовика с описанием самой директории и для чего она нужна.

В папке Drawable нужно размещать файлы изображений, используемые программой.

Папка Layout содержит файлы графического интерфейса.
В папке Values различные параметры, которые можно создавать и загружать при работе приложения (к примеру можно запомнить логин и пароль туда).

После создания пустого проекта мы можем его скомпилировать, нажав F5 — откроется настройки виртуальной машины с выбором устройства на котором запускать тест программы. Если подсоединить свой девайс на андроиде со включенной функцией отладки по USB (это в настройках, вкладка «для разработчика») то можно запустить и потестить непосредственно на нем. Очень советую проводить тесты на реальном устройстве т.к. многие тач элементы нельзя протестировать на виртуалке, к тому же, лично у меня на виртуальной машине приложение развертывается довольно долго. Между компиляцией и запуском на виртуалке проходит около минуты.

По умолчанию мы имеем кнопку, при нажатии на которую будет выведено сколько раз мы кликнули по оной. Попробуем сделать что-нибудь поинтереснее.

Откроем файл интерфейса и попробуем его поменять.


Снизу 2 вкладки- просмотр кода интерфейса и самого интерфейса. Справа- различные компоненты.
Сразу скажу: пользоваться встроенной формоклепалкой это не для слабонервных. Она на столько лагуча и делает не то, что ожидаешь что просто ужас. Вместо этого можно пользоваться сайтом droiddraw.org после составления интерфейс там и нажатие на кнопку Generate можно скопипастить код во вкладку кода и все будет ок.

А в прочем, самый лучший способ это создавать интерфейс из кода, посредством формул исходя из соотношений разрешения экрана. Без этого нормальный интерфейс, привлекательно смотрящийся на всех экранах создать сложно.
Однако, пока пойдем по простому пути.

Есть несколько типов расположения объектов на экране- типов слоев. При этом многие из них могут содержать друг друга и уживаться вместе. Рассмотрим из них:

1) LinearLayout — каждый элемент ниже предыдущего.
2) RelativeLayout — каждый элемент находится по отношению к предыдущему (к примеру, можно задать параметр находиться слева от кнопки1, снизу от текстбокса, в отступе в 40 пикселей снизу от кнопки 2 и т.д.

Настройки каждого компонента у нас в окне свойств- все довольно привычно, а сами свойства схожи с винформ элементами.

Создав более или менее привлекательный интерфейс его надо как то запустить.
Для этого существует Activity. По умолчанию у нас файл с названием Activity1, в котором класс- наследник от класса Activity.

Строка над объявлением класса-
[Activity(Label = «AndroidApplication1», MainLauncher = true, Icon = "@drawable/icon")]
описывает заголовок окна приложения, иконку и узнает запускать ли эту активити при запуске приложения.
Из основной автозапускаемой активити можно запустить любую другую. После автозагрузки данной активити после старта приложения мы загружаем интерфейс строкой SetContentView(Resource.Layout.Main);

Для получения доступа к любому элементу мы должны воспользоваться функцией FindViewById<>(); при присвоении экземпляру класса таго элемента, который нам нужен. Конкретно в нашем примере мы видим строчку

FindViewById(Resource.Id.MyButton);

«MyButton» это название кнопки, посмотреть его можно при создании интерфейса во вкладке код.

Посредством простой конструкции Button button = FindViewById(Resource.Id.MyButton);
мы можем работать с кнопкой и обрабатывать все действия с ней. В данном случае обработчик клика выглядит так:

button.Click += delegate { button.Text = string.Format("{0} clicks!", count++); };

Спроектировав и написав приложение мы моем скомпилировать apk файл посредством перехода во вкладку построение и нажатии кнопки Package for android. В папке проекта появится 2 файла, один из которых подписан автоматической подписью- его мы и можем использовать для установки па устройство.

На этом, думаю, этот краткий туториал можно закончить. В будущем скорее всего напишу подобный туториал по портированию и разработке на iOS.
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 77

    +3
    Пользуюсь тулзами уже несколько месяцев, самое отвртительное это отладчик, падает, глючит, вешает приложение, постоянно нужно делать какие то телодвижения что бы запустить отладку заново… рекламируют хорошо а вот на деле всё как то не очень…
      +1
      по моим наблюдениям, это зависит от девайса и от версии андроида. я, впрочем, наблюдал другую беду — эксепшены не всегда отладчиком ловятся, иногда улетают в debug log и всё.
        +1
        Используем Galaxy Nexus (с гугловой поддержкой, нативный андроид 4.2.2), Samsung Galaxy SII, ZTE Skate, везде ведёт себя одинаково, через несколько запусков начинает отваливаться отладчик, и если например в брекпоинте нажать стоп, то приложение не убивается. По поводу эксепшенов да, и брекпоинты себя так же ведут если их ставить после запуска дебага… вообщем косяк на косяке если начинаешь плотно работать, я огорчён кач-вом продукта Xamarin :(, такое чувство что продают недоделку.
          0
          на нексусе и самсунге отладчик отсыхает, на xperia ray и motorola xoom — не отсыхает.

          а что саппорт, кстати, говорит? мои несколько багрепортов они уже пофиксили. с пираткой в этом смысле тяжелее.
            0
            У нас куплена лицензия, но в саппорт с этой проблемой я не обращался, меня больше беспокоят не сами отваливания сколько подвисания + не убивание процесса программы когда я жму стоп в отладке :)
              0
              пишите в саппорт, там вполне вменяемый народ. подвисаний у меня не было, но возможно это из-за галочки «завершать активити при их деактивации» в developer settings.
            0
            Та же история у меня была при разработке под Windows CE на нескольких девайсах. Дошло до того, что я вообще убрал кнопку «стоп» с тулбара студии, потому что после каждого стопа приходилось перезагружать девайс. Другие девайсы и родной CE эмулятор вели себя корректно.
              +2
              Это самое отвратительно когда средства разработки ведут себя подобным образом -_-
              0
              Какая версия IDE?

              Я испытываю теже проблемы и с Windows Phone разработкой под VS 2012, поэтому может быть дело не в интеграции.
                +1
                Никогда не испытывал проблем с отладкой под WP.
                  0
                  Возможно разного уровня приложения. Но под WP7 такого не было, когда появился WP8 и VS2012 соответственно появились странные глюки — при проигрывании видео, если поставить брейкпоинт при отдаче видео-фрейма из MediaStreamSource, то приложение начинает тормозить, но при этом студия не получает управления, если убрать брейкпоинт — все нормально. Также бывает, после входа в брейкпоинт не показываются значения локальных переменных.
                    0
                    Вы не указали версию, я имел ввиду WP7 и его SDK. С WP8 и 7.8 не работал.
            0
            Замарин сейчас активно работает над собственной Xamarin Studio. Будем надеяться, что в ней отладчик будет стабильнее.
              0
              Не известно примерных сроков на релиз?
                +1
                Уже в закрытой бете, раздают доступ. Подробности на их блоге, мне недели за 2 приглашение пришло.
                  +2
                  Вы меня прям заинтриговали!
                  Но видимо пока это все большая-большая тайная, единственное что находится в поиске, это партнерское видео про компонент Pixate.

                  Интерфейс кстати весьма и весьма!
                    +1
                    Прям слюньки потекли :D
                0
                Это всего лишь обновленный MonoDevelop. Последний можно использовать и сейчас, но глюков там не меньше.
                0
                Почти полгода уже пишу для Galaxy Note, никаких проблем с отладчиком не замечал… Единственное что было — это глюк с деплойментом, который решался полной перекомпиляцией проекта. Но это единичные случаи.
                +1
                Кстати говоря, забыл добавить про недостатки этого фреймворка: помимо ситуации описанной постом выше прослеживается влияние джавы на который и происходит перевод кода при компиляции. Особо это заметно при работе с потоками- более жесткие условия доступа к переменным, вследствие чего иногда на устройстве с андроидом генерятся джава исключения которых бы не гинерилось при запуске кода на родном пк.
                  0
                  > джавы на который и происходит перевод кода при компиляции

                  см. habrahabr.ru/post/169467/#comment_5873897 — монодроид носит свой рантайм. но дополнительную сложность и глюкавость прослойки вносят, согласен.
                  –14
                  «Разработка приложений для Android с C#» — зачем?
                    0
                    Очевидно, чтобы не учить Java зная C#, и не менять привычную IDE.
                    +3
                    Я бы на вашем месте убрал бы AbsoluteLayout из списка.
                    Во первых его точно нельзя советовать к использованию, во вторых он был depricated еще аж с API 3.
                      –2
                      А разве есть ещё лайаут с точным позиционированием по координатам X,Y? Например при добавлении текстовой легенды к графику я использовал именно абсолют лайаут для движения легенды и для добавления текста в нужное место из кода.
                        0
                        А то вдруг в новой версии уберут AbsoluteLayout? Лучше использовать RelativeLayout. Пример со StackOverflow: http://stackoverflow.com/questions/3294590/set-the-absolute-position-of-a-view-in-android
                          +2
                          Практически любую разметку можно сделать используя: FrameLayout, LinearLayout и RelativeLayout.
                          При это не хардкодируя разметку из кода.
                            0
                            Статическую да, динамическую в любом случае придётся хардкодить и не самым красивым образом :(
                              0
                              Как раз речь о динамической, по этой причине в андроиде выкинули статический контейнер.
                              Если у вас проблемы с конкретной разметкой, приведите пример. Пишите в ПМ или здесь (не знаю на сколько актуально это будет в этой теме), обсудим.
                                0
                                Я наверное немного не корректно выразился. Под динамичностью я имел ввиду не адаптивность к разным разрешениям, а именно происходящее на экране, как например график. Кстати не посоветуете как улучшить производительность при отрисовке большого количества объектов?
                                  0
                                  1. Попробовать отсоединить дебаггер. Он очень сильно все тормозит. (Я, однажды, долго мучался с производительность, пока не осознал, что приложение просто колбасит с подключенным дебаггером).
                                  2. Хардкодить вручную на canvas в своем View. Тогда все просто летает.
                                    0
                                    Дебагер тут не причём, вплане и без дебагера туповато. Тогда остаётся последнее, но это наверное уже в следующей версии. :)
                                    Хардкодить через OnDraw же? Я правильно понял?
                                    0
                                    Сложно сказать не зная деталей. А график у вас рисуется на канве или состоит из view?
                                    По быстрому что удалось найти из примеров, это эквалайзер из cyanogenmod, исходник можно посмотреть тут: EqualizerSurface
                                    Картинка
                                      0
                                      А вы кстати библиотеки для графиков смотрели уже: chartdroid или achartengine
                                      Из платных есть: aicharts

                                      з.ы. не туда ответ нажал.
                                        0
                                        Полученный график очень специфичен, поэтому использовать библиотеки графиков не получилось.
                                        0
                                        Сейчас график строится из view, что довольно лагуче на девайсах со слабым процом. Я так понимаю что если перестроить его через OnDraw то будет гораздо быстрее? Просто работы по его перестроению довольно много, не хотелось бы спускать время в унитаз если это не даст результата :(
                                          0
                                          Должно быть быстрее. Самое простое это взять готовую библиотеку и проверить, а там будет видно стоит оно того или нет. Даже если они не подойдут, как минимум можно их рендер взять и сверху что то докрутить. Всяко проще чем писать самим.

                                          Раз у вас на вьюшках график, то нужно удостоверится что:
                                          1. view кешируются
                                          2. view которые не видно на экране не создаются
                                          Что бы не было так, что вы сразу залпом создали 600 view даже те которые не видны и засунули их в ScrollView, а потом тупо их все кинули и все создали заново.

                                          Если есть демка графиков с тормозами в виде апк, это бы помогло понять вашу проблему, и взглянуть на иерархию вьюшек.
                                            +1
                                            1. надо проверить
                                            2. это точно не наш стиль :D

                                            Залпом они создаются вначале при инициализации, а потом обновляются только те которые изменились по данным устройства.
                            –14
                            Все чюдастей и чудастей. То есть сначала, код виртуальной машины C# конвертится в говно-код (ибо скорее всего без оптимизаций) интерпретируемой виртуальной машины Dalvik, которое все это начинает неспеша жевать на 4-ех ядрах и гиге оперативы. Ну не лол ли? Пишите на Си и асме под мобильные платформы, елы палы, хорош свой тормозной говнокод в сотню мегобайт вываливать. Не можете — не пишите вообще.
                              0
                              FYI: монодроид либо компилится в native, либо носит с собой свой JIT (в зависимости от настроек), и работает в разных сценариях от 3 (строки) до 10-20 (математика с плавающей точкой) раз быстрее интерпретируемого Dalvik'a :)
                                –11
                                Ну а где про это в статье-то? Теперь да, буду знать. Тогда хорошо, можно для небольших домашних поделок пользовать.
                                +4
                                Я бы посмотрел как вы бы написали приложение под «на Си и асме» и что бы это все работало на любом железе под управлением андроида.
                                  –2
                                  дык можно же, и выложить в маркет пачку бинарей под разные процессоры. только GUI все равно без интеропа с джавой не напишешь, увы.
                                    0
                                    Угу- всегда можно выпустить под разные процессоры, версии андроида, сделать поддержку кучи китайских планшетов что есть у многих пользователей в силу малой цены, накомпилить кучу всего и заставить пользователя далекого от этого разбираться в том как же это хотя бы установить.
                                    Если бы все было так хардкорно то у планшетов и смартфонов не было бы так много пользователей.
                                    Судя по хардкорности троникса он наверняка совершает звонок со своего смартфона через косоль.
                                    0
                                    А как этого добиваются в Marmalade?
                                      0
                                      Скомпилировал бы под ARM, x86 и MIPS.
                                      0
                                      Продемонстрируете нам свой скоростной красивокод?
                                      Судя по вашему сообщению именно вы знаете как его писать.
                                      0
                                      > кряком из интернета (который лежит далеко не на первой странице гугла)

                                      hint: кряк гуглится по названию главного EXE монодроида :)

                                      но я купил лицензию и в общем не жалею об этом.
                                        –2
                                        Полезная же статья, за что слили карму человеку? Уже -4!
                                          –2
                                          Прошу прощения, не обратил внимание, что это recovery mode.
                                          0
                                          Пора Моно учить
                                            +3
                                            Для начала бы узнать, СКОЛЬКО оно стоит ;-)
                                            0
                                            Вопрос почти по теме: а кто то щупал MvvmCross?
                                              0
                                              В данный момент щупаю:
                                              — приходится писать больше кода
                                              + большая часть кода кроссплатформена
                                              + Стюард (автор mvvm cross) реагирует даже на русскоязычные твиты о своей платформе.
                                              0
                                              Подскажите дотНет разработчику. Если прямо сейчас начинать разрабатывать для смартфонов с андроидом, то на какую версию этого самого андроида ориентироваться?
                                                +1
                                                Статистику по распределению версий можно всегда посмотреть вот здесь. Если ориентироваться на версию 2.2, то покроете больше 97% устройств.
                                                  +1
                                                  А чем отличаются версии? В новых версиях есть нечто такое, чего не было раньше? Приложение, написанное для 4,0 просто не запустится на устройстве с 2.3? Что я теряю, если пишу для 2.2, вместо новейшей версии?
                                                    0
                                                    Очень обширный вопрос. На странице по ссылке, которую я вам привел, слева есть меню с кодовыми названиями версий Андроида, начиная с 2.3 «Gingerbread». По нажатию на название, вам покажут страничку с основными нововведениями в данной версии. Вообще, минимальная поддерживаемая версия 2.2 не значит, что вы не сможете использовать возможности из более новых версий. В Андроиде есть понятия Min SDK Version и Target SDK Version. Если интересно можете прочитать про разницу на StackOverflow: http://stackoverflow.com/questions/4568267/android-min-sdk-version-vs-target-sdk-version. А так же многие вещи были бэкпортированы из новых версий в старые или самим Гуглом (Android Support Library), или сообществом (ActionBarSherlock, NineOldAndroids, HoloEverywhere). Так что жить можно :)
                                                      0
                                                      А реально использовать эти библиотеки с Mono for Android?
                                                    0
                                                    В основном, Андроид славен переписыванием доброй части фреймворка при переходе от версии к версии (совместимость зачастую остается на уровне грязных хаков или сторонних компонентов). Можете сами прикинуть, какое это доставляет удобство в разработке.
                                                  0
                                                  Уже на четверку в общем-то. Двойки вам доставят хлопот с совместимостью, а доля их все быстрее снижается. Если год назад она составляла 90%, то сейчас это уже далеко не так. Пока вы сделаете свое приложение, все еще сильнее изменится.
                                                    0
                                                    Вот информация по распределению версий годичной давности: http://phandroid.com/2012/02/02/ice-cream-sandwich-now-on-1-of-android-devices-gingerbread-still-growing/, сравните с текущими данными. Доля Андроида 2.3.3 за год упала с 58,6% до 45,4%. Что-то мне подсказывает, что еще минимум года два (а то и больше) придется эту версию поддерживать.
                                                      0
                                                      2.3+2.2 составляла 90%. Сравните с текущими данными :)
                                                        0
                                                        Сейчас в сумме 53,7%, а через год будет 20-30%, по-моему такая доля еще стоит поддержки.
                                                  –2
                                                  1) Visual studio C# версии professional и выше (пойдет и крякнутая)
                                                  2) Сам фреймворк (а он, в свою очередь установит за нас и джаву, и виртуальную машину и все остальное)

                                                  Если с первым все понятно, то со вторым сложнее- как оказалось в процессе использования фришная версия монодроида не умеет компилировать .apk файлы, так что стоит либо его купить, либо воспользоваться кряком из интернета (который лежит далеко не на первой странице гугла).

                                                  Ай яй яй… К чему нас автор призывает…
                                                    0
                                                    Для интерфейсов, по-моему, лучше Eclipse использовать. Он автоматически и центрует, и wrap_content/fill_parent выбирает.
                                                    • НЛО прилетело и опубликовало эту надпись здесь
                                                        –3
                                                        Плюсы:
                                                        — можно остаться на любимой Visual Studio (правда, с отладкой проблемы)
                                                        — можно reuse часть своего и third party кода на C#
                                                        — можно не учить java и/или ObjectiveC

                                                        1. Далеко не всегда.
                                                        2. Именно для этого все и затевается.
                                                        3. Вероятнее всего, потребуется выучить (как минимум азы, хотя бы для работы с GUI).
                                                        Минусы:
                                                        — производительность приложений
                                                        — невозможность использовать native code (вот в этом не уверен)
                                                        — зависимость от third party фреймворка (допустим, компания вылетела из бизнеса и перестала поддерживать фреймворки; в новых версиях Android и iOS начинаются проблемы)
                                                        — необходимость тащить за собой чужой фреймворк
                                                        — невозможность использовать third-party java код (которого куда больше, чем C#!)

                                                        1. Производительность в общем случае не страдает. И в любом случае, тут больше проблем бывает от кривой архитектуры, чем от фреймворка.
                                                        2. Возможно.
                                                        3. Да, есть такое.
                                                        4. Для большинства случаев — не беда.
                                                        5. Эмм, для шарпов кода прямо таки тоже немало.

                                                        Отвечая на ваш последний вопрос. Мне в перспективе нужен программист Monotouch. И да, он должен знать и C# и Objective-C. Ну и эцсамое, monotouch под винду не работает (если мы о полноценной работе хотя бы с эмулятором, а не просто писание кода).
                                                        • НЛО прилетело и опубликовало эту надпись здесь
                                                            –1
                                                            Видео стриминг — очень ресурсоемкая задача и жестко заточена на платформенные реализации соответствующих примитивов. Понятно, почему ее не выходит решать с помощью данных фреймворков.

                                                            У меня ситуация другая. Ядро приложения это специфическая ORM над базой данных + логика вокруг объектов из этой ОРМ. Самый большой объект там — картинка. А платформы по сути различаются только представлением. В итоге же получается, что глупо каждый раз писать ядро заново. Ну, как минимум, нерационально.

                                                            Специалист на каждую платформу обязательно будет. Как только появятся деньги весь этот банкет оплачивать ;)
                                                          –1
                                                          >можно не учить java и/или ObjectiveC
                                                          По факту, нужно уметь читать этот код. На stackoverflow ответов на родных ЯП конечно больше.

                                                          >невозможность использовать third-party java код (которого куда больше, чем C#!)
                                                          Возможность. Вы можете подключать андроидовские (айфоновские) библиотеки к своему проекту.

                                                          > зависимость от third party фреймворка (допустим, компания вылетела из бизнеса и перестала поддерживать фреймворки; в новых версиях Android и iOS начинаются проблемы)

                                                          Ну пока ребята выпускают новые версии через пару часов после эппла, получили солидные деньги от мс и, насколько мне известно, вполне удачно их расходуют.
                                                          0
                                                          Не могу запустить приложение на эмуляторе выдаёт ошибку:

                                                          Ошибка
                                                          — — System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта.

                                                          в Mono.VisualStudio.Extension.StatusBarHelper.get_IsFrozen()

                                                          в Mono.VisualStudio.Extension.StatusBarHelper.SetText(String text)

                                                          в Mono.Android.VisualStudio.MonoAndroidDeploySession.ShowProgressText(String text, CancellationToken token)

                                                          в Mono.Android.VisualStudio.MonoAndroidDeploySession.BuildAndSignPackage(CancellationToken token)

                                                          в Mono.Android.VisualStudio.MonoAndroidDeploySession.DeployApplication(AndroidDevice device, CancellationToken token)

                                                          в Mono.Android.VisualStudio.MonoAndroidDeploySession.OnDeploy()
                                                          — ОК


                                                          В чём проблема?
                                                          • НЛО прилетело и опубликовало эту надпись здесь
                                                              0
                                                              и где он там?
                                                            0
                                                            Не подскажите в чем может быть проблема, при доступе в main.axml выскакивает такая ошибка

                                                            image

                                                            Более подробно проблему расписал здесь. Буду благодарен если поможете ее решить.
                                                              0
                                                              Пишем уже 4 года на Xamarin. И только на нем (серверные части MS SQL asp.net mvc и т.п.). Никаких проблем нет с производительностью и возможностями (у нас в основном заказчики ТОП Розничные компании, внедряли и iBeacon и т.п.). После покупки Microsoft стало даже как-то спокойнее :) Клиенты реагирует более приветливо когда говоришь про инструмент для разработки мобильных приложений. Сейчас даже сделали на базе Xamarin конструктор мобильных приложений (рынок просит, исходный код открыт и т.п. http://appropio.com)… В общем как человек из бизнеса — могу рекомендовать однозначно Xamarin.

                                                              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                                              Самое читаемое