在上一篇文章中 ,我解释了如何在Apache Cordova中使用Ceylon来为每个移动平台(包括iOS和Android)编写应用程序。 这次,道歉很晚(下周变成下个月),我将解释如何使用Ceylon IntelliJ插件在Android Studio的Ceylon中编写本机Android应用程序。
Android Studio上的Ceylon入门
要开始在Android Studio中编写Ceylon应用程序,请按照以下步骤操作:
- 下载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
: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应用程序。 现在,您在app/src/main/ceylon
拥有Ceylon源代码,并且其中包含模块描述符和空活动:
目前,这需要构建一个Ceylon 1.2.3
发行版,并且由于尚未发布,因此您将不得不自己构建一个 (只是“ Getting the source
部分),或者下载一个夜间版本 。 有了它之后,在附近编辑app/build.gradle
然后结束添加ceylon > ceylonLocation
并将其指向安装发行版的位置(它需要指向Ceylon二进制文件,而不仅仅是指向发行版的根目录):
ceylon {
// ...
ceylonLocation ".../ceylon/dist/dist/bin/ceylon"
}
确保单击立即Sync now
以同步Gradle构建。
现在,我们正在修复一个错误,该错误无法检测到Android SDK工具和模块的确切版本,因此,根据您使用的Android Tools版本,您可能必须同步导入的错误。 com.android.support:appcompat-v7:23.1.1
在app/build.gradle
(在dependencies
),并在锡兰模块描述符module.ceylon
。 确保Ceylon导入版本与Gradle导入版本相同,因为由于Android的特殊性,Gradle构建才使其可用于Ceylon。
为了完成转换,请确保删除Java活动(因为我们将使锡兰保持一个状态),在Project Files
,删除app/src/main/java
。
由于另一项待解决的插件修复,您可能此时必须单击Tools > Ceylon > Reset Ceylon Model
以使Ceylon插件与所有这些过去的更改保持同步(不要担心,我们目前正在对此进行修复)。
好消息是,我们已经能够单击“ Run app
并在模拟器中进行尝试,但我们将使其更加有趣。
自定义您的Ceylon Android活动
我们将显示在Ceylon Herd上发布的Ceylon模块的列表,因此我们将使用Ceylon SDK,尤其是您必须编辑module.ceylon
以添加以下导入:
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
并运行一个异步任务以连接到Herd REST端点,因此使用以下命令编辑MainActivity.ceylon
:
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);
LoadModules().execute("https://modules.ceylon-lang.org/api/1/complete-modules?module=ceylon.");
}
}
现在编辑app/src/main/res/layout/activity_main.xml
以将活动类型更改为列表活动:
<ListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@android:id/list"/>
最后,由于我们正在访问Web服务,因此将其添加到app/src/main/res/AndroidManifest.xml
,最后为您的应用请求network
许可:
<uses-permission android:name="android.permission.INTERNET"/>
这就是您所需要的,现在只需单击Run > Run app
然后观看您的Ceylon应用程序显示仿真器中的模块列表:
一些技术信息
Ceylon IntelliJ插件尚未发布,但是预览即将发布。 试试看时,您会发现它已经相当先进了。 不要犹豫, 报告任何错误 ,或者更好的是,提供修复程序:)
除了上述注意事项以及Android Studio尚无法识别Ceylon类之外,大多数功能都可以在Android上正常运行,因此在引用它们的.xml
文件中以及运行它们时,它们将被标记为错误。应用程序将报告错误:
Could not identify launch activity: Default Activity not found. Error while Launching activity
这仅意味着它无法启动您的应用程序,您必须单击它才能在模拟器中启动它。 但是部署成功了。 我们目前正在解决此问题,因此只会有所改善。
如果您想恢复到Ceylon Eclipse IDE来编辑Ceylon Android应用程序,则可以,一旦使用Android Studio设置了项目,它就可以使用。 使用它进行设置要容易得多,因此所有Gradle配置都是正确的。 一旦完成,就可以使用Eclipse,并使用$ ./gradlew assembleDebug
来构建APK。
这项工作取决于我们在Ceylon 1.2.3(即将发布)中所做的更改,该更改增加了对jar的支持,这些jar提供了备用的较小的JDK(例如Android jar),并提高了模块性,从而使创建的应用程序所依赖的更少运行时Ceylon罐子比以前更罐,修复了运行时元模型以支持Android运行时,以及其他一些调整。 我可能会在以后的博客文章中写所有这些内容。
这项工作还取决于Renato Athaydes编写的Ceylon Gradle插件 ,以及新的Ceylon Gradle Android插件 ,该插件在Android应用程序中增加了对Ceylon的支持。 这个插件还没有完成,特别是还不支持增量编译(即使Ceylon IDE和编译器也可以)。 它还不支持最新的Android Instant Run
功能。 再次,请报告问题或更佳的结果,提出拉取请求:)
翻译自: https://www.javacodegeeks.com/2016/06/ceylon-on-android.html