2011年12月23日

在 STS 中整合 Grails 與 Scala

目前看到新發佈的 Grails v2.0.0,馬上就試著加到 STS (SpringSource Tool Suite)中;但心想 open source 界熱門話題的 Scala 剛推出 v2.0,也一併來用用看。
於是在一個練習的 grails project 安裝了 scala plugin (v0.6.4),接著在 src/scala 中寫了一個 .scala ;不過 run-app 時出現了 ...

[scalaPlugin] Compiling Scala sources to target/classes
 | Error Error executing script Compile:
 : Could not compile Scala sources: BuildException:
 Compile failed because of an internal compiler error (object scala not found.);
 see the error output for details. (Use --stacktrace to see the full trace)

而網路上已有了解決的方法(如下圖所示),顯然這不構成問題。






但試想:每每得先 grails compile 出 .class 才能做單元測試,試乎沒用到 IDE 中 scala builder 的好處。所以,我將這個 project 加上 builder:

 org.scala-ide.sdt.core.scalabuilder
 

與 nature :
org.scala-ide.sdt.core.scalanature
而此舉引發了兩個的問題:
IDE 會出現要求加入 scala library 的錯誤訊息。
但加了 lib 之後,則又引起了 grails builder 的編譯錯誤。 

所以,我改了方式: 保持這個 grails project 的原樣,另起一個 scala project;
而這個新 project 的 src 目錄以 link folder 的形式連接到 grails project 的 src/scala。 如下圖所示:




























這樣子就能寫 .scala 時做單元測試,而又不影響 grails project 的任何操作了。

2011年12月3日

第一個 Android 練習題撰寫心得

學習第一個 Android 程式時,通常會在第一個 Activity 中載入 main layout (res/layout/main.xml)
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
}
但,當預期中元件相關的屬性不符需要,那就由程式碼來動態控制;如取得 layout :
LinearLayout linear = (LinearLayout)findViewById(R.id.linear);
...
只要在 layout 中定義即可:
< LinearLayout android:id="@+id/linear" >
接著,試想某些情形在 class 設計耦合上不與 layout 直接相關,那就得搬出 API :
先取得 content view:
View contentView = getWindow().getDecorView().findViewById(android.R.id.content);
取得 layout (如果預期是 LinearLayout):
LinearLayout linear = (LinearLayout)((ViewGroup)contentView).getChildAt(0);
看來只要是 ViewGroup class ,就有機會介由 .getChildAt() 取得物件;再由 instanceof 辨識 class type。
唯,物件的辨別稍微麻煩;目前為止,我只想到 android:tag="..." 來加以利用。

另外,過去維護大型系統或 class 較多的 project 時,多半不開啟 [Build Automatically] 功能;但 Android project 則是必要的,因為 layout file 任何的異動,會由 Android 的 builders 來產生新的 R class,以便在 activity class 中進行 reference。
而 resource files 之間,字串 id 的參考最為常見,所以 res/values/strings.xml 維護更需要 [Build Automatically] 功能的運作。