Статьи

Цейлон на Android

В своем последнем посте я объяснил, как вы можете использовать Ceylon в Apache Cordova для написания приложений для любой мобильной платформы, включая iOS и Android. На этот раз, из-за множества извинений за позднюю запись («следующая неделя» перешла в следующий месяц), я объясню, как использовать плагин Ceylon IntelliJ для написания собственных приложений Android на Ceylon в Android Studio.

Начало работы с Ceylon на Android Studio

Чтобы начать писать приложения Ceylon в Android Studio, выполните следующие действия:

  • Скачать Android Studio
  • Начни это
  • Создайте новое приложение, нажав « Start a new Android Studio Project
  • Вы можете использовать эти значения для Application name : CeylonDemo
  • И для Company domain : android.example.com
  • Далее выберите Empty activity с Activity Name : MainActivity
  • Нажмите Finish и дождитесь создания проекта

На данный момент у вас есть открытый проект Android, но у нас еще не было времени установить плагин Ceylon, поэтому давайте сделаем это прямо сейчас:

  • Нажмите File > Settings > Plugins > Browse Repositories
  • Тогда на Manage Repositories > +
  • Добавьте этот репозиторий: https://downloads.ceylon-lang.org/ide/intellij/development/updatePlugins.xml
  • Теперь нажмите на Install Ceylon IDE

Скорее всего, вам придется перезапустить Android Studio, так что сделайте это.

Далее мы собираемся преобразовать наш проект Android в проект Ceylon Android:

  • В представлении Android щелкните правой кнопкой мыши app > Configure Ceylon in this Module
  • Нажмите OK в появившемся диалоговом окне конфигурации

Это создаст плагин Ceylon и добавит большую часть того, что вам нужно в вашей сборке Gradle для создания приложений Ceylon для Android. Теперь у вас есть исходники Ceylon в app/src/main/ceylon и он включает в себя дескриптор модуля и пустое действие:

язь

На данный момент для сборки требуется дистрибутив Ceylon 1.2.3 , и, поскольку он еще не выпущен, вам придется либо собрать его самостоятельно (только часть « Getting the source ), либо загрузить ночную сборку . Как только вы это сделаете, отредактируйте app/build.gradle рядом с end, чтобы добавить ceylon > ceylonLocation и укажите, куда вы установили ваш дистрибутив (он должен указывать на двоичный файл Ceylon, а не только на корень дистрибутива):

1
2
3
4
ceylon {
    // ...
    ceylonLocation ".../ceylon/dist/dist/bin/ceylon"
}

Убедитесь, что вы нажали « Sync now чтобы синхронизировать сборку Gradle.

Сейчас мы находимся в процессе исправления ошибки, которая не позволяет определить точную версию инструментария и модулей Android SDK, и поэтому в зависимости от используемой версии Инструментов Android может потребоваться синхронизировать импорт com.android.support:appcompat-v7:23.1.1 в app/build.gradledependencies ) и в дескрипторе модуля Ceylon в module.ceylon . Убедитесь, что версия импорта Ceylon такая же, как версия импорта Gradle, потому что сборка Gradle делает ее доступной для Ceylon из-за особенностей Android.

Чтобы завершить преобразование, убедитесь, что вы удалили действие Java (так как мы собираемся сохранить Ceylon), в Project Files удалите app/src/main/java .

Из-за другого ожидающего исправления плагина в этот момент вам, возможно, придется нажать Tools > Ceylon > Reset Ceylon Model Цейлона, чтобы плагин Цейлона синхронизировался со всеми этими прошлыми изменениями (не беспокойтесь, мы исправляем это в данный момент).

Хорошей новостью является то, что мы уже можем нажать на « Run app и попробовать это в эмуляторе, но мы сделаем его немного интереснее.

Настройка вашей активности на Ceylon для Android

Мы собираемся отобразить список модулей Ceylon, опубликованных в Ceylon Herd , поэтому мы будем использовать Ceylon SDK, и, в частности, вам нужно будет отредактировать module.ceylon чтобы добавить следующий импорт:

1
2
3
4
5
import ceylon.http.client "1.2.3";
import ceylon.uri "1.2.3";
import ceylon.json "1.2.3";
import ceylon.collection "1.2.3";
import ceylon.interop.java "1.2.3";

Далее мы собираемся превратить нашу MainActivity в ListActivity и запустить асинхронную задачу для подключения к конечной точке REST Herd, поэтому отредактируйте MainActivity.ceylon с помощью этого:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import android.os { Bundle, AsyncTask }
import android.app { ListActivity }
import android.widget { ArrayAdapter, ListAdapter }
import android.support.v7.app { AppCompatActivity }
import ceylon.interop.java { createJavaStringArray }
import java.lang { JString = String }
import android { AndroidR = R }
import ceylon.language.meta { modules }
import ceylon.uri { parseUri = parse }
import ceylon.http.client { httpGet = get }
import ceylon.json { parseJson = parse, JsonObject = Object, JsonArray = Array }
import ceylon.collection { MutableList, LinkedList }
 
shared class MainActivity() extends ListActivity() {
 
class LoadModules() extends AsyncTask<String, Nothing, List<String>>() {
shared actual List<String> doInBackground(String?* uris){
assert(exists uri = uris.first);
value response = httpGet(parseUri(uri)).execute();
value modules = LinkedList<String>();
assert(is JsonObject json = parseJson(response.contents),
is JsonArray results = json["results"]);
// Iterate modules
for(res in results) {
assert (is JsonObject res); // Get the list of versions
assert (is String name = res["module"],
is JsonArray versions = res["versions"]);
modules.add(name);
print(name);
}
return modules;
}
shared actual void onPostExecute(List<String> result){
print("Got result: ``result``");
 
ListAdapter adapter = ArrayAdapter<JString>(outer, AndroidR.Layout.simple_list_item_1,
createJavaStringArray(result));
listAdapter = adapter;
}
}
 
shared actual void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.Layout.activity_main);
 
}
}

Теперь отредактируйте app/src/main/res/layout/activity_main.xml чтобы изменить тип действия на список действий:

1
2
3
4
<ListView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@android:id/list"/>

И, наконец, запросите разрешение network для вашего приложения, поскольку мы подключаемся к веб-службе, добавив его в app/src/main/res/AndroidManifest.xml :

1
<uses-permission android:name="android.permission.INTERNET"/>

Это все, что вам нужно, теперь просто нажмите Run > Run app и посмотрите, как ваше приложение Ceylon отображает список модулей в эмуляторе:

заявление

Некоторая техническая информация

Плагин Ceylon IntelliJ еще не был выпущен, но предварительный просмотр ожидается в ближайшее время. Вы увидите, что это уже достаточно продвинуто, когда вы попробуете это. Не стесняйтесь сообщать о любых ошибках или, что еще лучше, вносить исправления 🙂

Большинство из них работает достаточно хорошо для Android, за исключением оговорок, отмеченных выше, и того факта, что Android Studio еще не распознает классы Ceylon, поэтому они будут помечены как ошибки в .xml файлах, которые к ним относятся, и при запуске Приложение сообщит об ошибке:

1
Could not identify launch activity: Default Activity not found. Error while Launching activity

Это только означает, что оно не может запустить ваше приложение, вам нужно будет нажать на него, чтобы запустить его в эмуляторе. Но развертывание сработало. Мы исправляем это на данный момент, так что это только улучшится.

Если вы хотите вернуться к IDE Ceylon Eclipse для редактирования своего приложения Ceylon для Android, вы можете, это сработает, как только ваш проект будет настроен на Android Studio. Его гораздо проще использовать для настройки, поэтому все настройки Gradle правильные. Как только это будет сделано, вы можете использовать Eclipse, если хотите, и использовать $ ./gradlew assembleDebug для сборки вашего APK.

Эта работа зависит от изменений, которые мы внесли в Ceylon 1.2.3 (который скоро будет выпущен), который добавляет поддержку jar-файлов, которые предоставляют альтернативные меньшие JDK (например, jar-файл Android), улучшения модульности, так что созданные приложения зависят от гораздо меньшего количества Цейлонские фляги времени выполнения, чем раньше, исправления в метамодели времени выполнения для поддержки времени выполнения Android и ряд других настроек. Я, вероятно, напишу отчет обо всем этом в будущей записи в блоге.

Эта работа также зависит от плагина Ceylon Gradle, написанного Renato Athaydes, и от нового плагина Ceylon Gradle Android, который добавляет поддержку Ceylon в приложениях Android. Этот плагин ни в коем случае не завершен и, в частности, пока не поддерживает инкрементную компиляцию (хотя в Ceylon IDE и компиляторе это делается). Он также пока не поддерживает последнюю функцию Android Instant Run . Опять же, пожалуйста, сообщайте о проблемах или, что лучше, отправляйте pull-запросы 🙂

Ссылка: Ceylon на Android от нашего партнера JCG Стефана Эпардо в блоге команды Ceylon Team .