2011年8月26日 星期五

[ Google Android 教學 ] 入門 : 建立第一個程式

轉載自 這裡
在前幾章我們已經學到怎麼開啟現有的專案,也導覽過了整個模擬器的設定流程。 現在我們從設計一個簡單實用的身高體重指數計算(BMI)應用程式開始,學習設計一個 Android 應用程式所需的基礎. 維基百科上這麼介紹 BMI 身高體重指數 : 

身高體重指數(又稱身體質量指數,英文為Body Mass Index,簡稱BMI)是一個計算值。
...當我們需要比較及分析一個人的體重對於不同高度的人所帶來的健康影響時,
BMI值是一個中立而可靠的指標...

簡而言之,我們要設計的程式就是允許輸入身高體重,按下「計算 BMI」鍵後就在螢幕上顯示 BMI 值,並彈出「你應該節食囉」、或「你應該多吃點」...等健康建議。健康建議的判斷: 只要 BMI 值超過 「25」 時就算偏胖、BMI 值低於 「20」 就算偏瘦。 判斷寫得很簡單。畢竟我們要學習的關鍵知識,不是在於 BMI 值的算法或健康建議的內容,而是在於 Android 程式的運作方式.

建立新程式專案 :
首先,我們照前面章節的教學,建立一個新的程式專案。並將新專案名稱命名為 BMI. 在「內容」欄裡,我們選擇「在工作區域中建立新專案」(Create new project in workspace)。 這時,如果在"選擇欄"取消掉勾選「使用預設目錄」(Use default location) 選項,我們就可以切換儲存專案的資料夾。 大部分的時候我們並不需去改動這個選項,而是直接使用預設的資料夾.
前面章節中都是開啟現有的專案,因此那些專案屬性 (Properties) 等內容都被自動填寫好了。這章中要從無到有新建一個專案,因此我們必須自行填寫專案相關的屬性, 在此對"New Android Project" 對話框中出現的這些欄位作些簡單的說明 :
- Project Name
包含這個項目的資料夾的名稱

- Application Name
顯示在應用程式上的標題

- Package Name
套件(Package)名稱,JAVA 的習慣是用套件名稱來區分不同的類別(class)。依照專案的不同,我們會起不同的路徑名稱。

- Create Activity
使否建立這個是項目的主要類別,勾選後可以指定這個類別的名稱。這個類別是一個 Activity 類別的子類別。我們可以在「Activity」中啟動程式和控制程式流程,或是根據需要控制螢幕、界面。

- Build Target
選擇用來編譯專案的 SDK 版本。 當選定了 Build Target 後,開發工具會在 Min SDK Version 欄位中自動填入對應的值

- Min SDK Version
本應用程式所支援的最低 SDK 版本代號

接著我們在建立新Android Project 的欄位中分別填入以下的值 :



填好值後按下「Finish」 按鈕,就建立好新專案了. 注意 Package Name 的設定,必須至少由兩個部分所構成,例如:com.android。「Activity Name」是指定用來產生預設 java 程式碼的文件名稱,與文件中預設 Activity 類別 (class) 的名稱。依照 java 語言的命名習慣,「Activity Name」最好採用開頭大寫的形式.

程式專案架構 :
乍看之下,Android 插件已幫我們建立了不少檔案. 檢視新建立的 BMI 檔案夾中的內容,我們可以將一個 Android 應用程式基本的檔案結構歸納成如下分支, 接著我們來看看 Android 應用程式的基本檔案結構,以及各自所負責的內容 :
- src/ 原始碼(source)目錄

src 目錄中包含了一個 Android 應用程式中所需的各個程式碼檔案。這些檔案被包在對應 package 的子目錄下。(如本章的 BMI 例子中,子目錄指的就是 /src/com/demo/android/bmi/)
src 目錄中比較關鍵的程式有 :
1. Bmi.java 這個檔案的檔名會隨著你在建立一個新的程式專案畫面中所填入「Create Activity」欄位值的不同而改變。這是新程式專案中的主要程式區塊。我們開發 Android 程式的多數時間,都是在 src 目錄下和 Android 打交道

- gen/ 自動生成(Generate)目錄

gen 目錄中存放所有自動生成的檔案. gen 目錄中最關鍵的程式就是 R.java 檔 :
1. R.java 這個檔是自動產生的。會由 ADT 插件自動根據你放入 res 目錄的 XML 描述文件、圖像等資源,同步更新修改 'R.java' 這個中介檔案。所有的 Android 程式中都會有以 R.java 為名的這個檔案,你完全不需要,也應避免手工修改 R.java 這個檔案。

R.java 中自動產生的 「R」 類別就像是個字典一樣,包含了使用者介面、圖像、字串等各式的資源與相應的編號(id). Android 應用程式中很多時候會需要透過 R 類別調用資源。 編譯時編譯器也會查看這個資源列表,沒有使用到的資源就不會編譯進去,為手機應用程式節省不必要佔用的空間.

- res/ 資源(Resource)目錄

「res」 目錄中存放所有程式中用到的資源檔案。"資源檔案"指的是資料檔案,或編譯時會被轉換成程式一部分的 XML 描述檔。Android 針對放在 「res」 目錄下的不同子目錄的資源,會有各自不同處理方式。因此我們寫程式時,最好能搞清楚各目錄下分別可放置的內容. res/ 中的檔案有 :
1. layout/ 版面配置(layout)目錄 「layout」目錄包含所有使用 XML 格式的介面描述檔。「layout」 中的 XML 介面描述檔就像寫網頁時用到的 HTML 檔案一樣,用來描述螢幕上的版面編排與使用的介面元件。XML 介面描述檔描述的內容可以是整張螢幕,也可以只描述一部分的介面(例如描述用來產生對話框的介面元件)。

雖然你也能直接通過 Java 來建立使用者介面,不過透過 XML 描述檔來建立使用者介面相對更簡單,架構也更清晰,以後維護時更容易釐清問題。要使用這些介面元件,應透過 「R.java」 檔中自動產生的 「R」 類別來調用。

2. values/ 參數值(value)目錄 「values」 目錄包含所有使用 XML 格式的參數值描述檔,可以在此添加一些額外的資源如字串(很常用)、顏色、風格等。使用時也是透過 「R」 類別來調用。

- Android 功能清單 (AndroidManifest.xml)

「AndroidManifest.xml」 是 Android 程式的功能清單,應用程式在這裡列出該程式所提供的功能。當應用程式開啟時,會提供諸如內容提供者(ContentProvider)、處理的資料類型、實際運行的類別、跨應用程式的資訊等等訊息。 你可以在此指定你的應用程式會使用到的服務(諸如電話功能、網路功能、GPS功能等)。 當你新增一個頁面行為類別 (Activity) 時,你也需要先在此註冊這個新增的 Activity 類別後,才能順利調用.

執行專案 :
接著如果要執行程式, 則在左邊 Package Exploer 上的 BMI 專案上點擊右鍵後執行 > Run As > Android Application :

接著就可以看到 AVD 的畫面了 :


參考資料 :
* Android 應用程式的檔案組織方式與用途 http://developer.android.com/guide/appendix/faq/commontasks.html#filelist

[ Java代碼範本 ] JDOM ( Java/xml ) 的使用範例


參考至 史帝芬心得筆記
前言 :
在Java的世界裡,要操控XML,最簡單的方法莫過於使用JDOM。在這裡我簡單的介紹如何用JDOM從無到有的建立一分XML、當有一份XML file時,如何將這個XML file讀進程式裡及如何利用JDOM將XML透過XSLT轉成HTML. JDOM是由Brett Mclaughlin和Jason Hunter編寫,在http://www.jdom.org可免費下載。

建立、新增、刪除、輸出 :
範例1展示如何建立、新增、刪除及輸出一份XML,每份XML在JDOM裡是由一個Document類別代表,所以一開始我們要先new一個Document,在建構Document時應指明根節點,如果沒有指明,在建構應由setRootElement設定。基本上XML都可以化成一個樹狀結構,所以,在產生根節點之後,就由根節點開始增加子節點,新增的方式是呼叫Element.addContent將新的節點加入。刪除如果知道是某節點以下的子節點,則可呼叫Element.getChildren取得所有子節點,再找出要刪除的點節予以刪除。

當建立好XML之後,通常我們會希望將它輸出到檔案,JDOM提供了XMLOutputter類別供我們輸出之用,輸出前要先設定編碼方式,不然,會以UTF-8為預設值,setNewlines則是指明輸出時是否要幫我們斷行,方便閱讀,如果沒有加這行指令,預設是不會斷行,那麼所有資料將在同一行上.
===== 範例 1 =====
  1. import org.jdom.*;  
  2. import org.jdom.output.*;  
  3. import java.io.*;  
  4. import java.util.List;  
  5.   
  6. public class myCreate {  
  7.   public myCreate() {  
  8.     String[] strChapter = { "XML簡論", "編寫XML", "剖析XML", "約制XML", "驗正XML", "轉換XML" };  
  9.     Element elmtRoot = new Element("Article");  
  10.     Document docJDOM = new Document(elmtRoot);  
  11.     //新增  
  12.     for(int i=0; i<6; i++) {  
  13.       Element elmtChapter = new Element("Chapter");  
  14.       elmtChapter.addContent(strChapter[i]);  
  15.       elmtChapter.setAttribute("sort", new Integer(i).toString());  
  16.       elmtRoot.addContent(elmtChapter);  
  17.     }  
  18.   
  19.     //刪除  
  20.     List lstChapter = elmtRoot.getChildren("Chapter");  
  21.     lstChapter.remove(4);  
  22.     //輸出  
  23.     OutputXML(docJDOM, "e:/myJDOM.xml");  
  24.   }  
  25.   
  26.   private void OutputXML(Document docXML, String strFilename) {  
  27.     XMLOutputter fmt = new XMLOutputter();  
  28.     try {  
  29.       fmt.setEncoding("big5");  
  30.       fmt.setNewlines(true);  
  31.       FileWriter fwXML = new FileWriter(strFilename);  
  32.       fmt.output(docXML, fwXML);  
  33.       fwXML.close();  
  34.     }  
  35.     catch (IOException e) {  
  36.       e.printStackTrace();  
  37.     }  
  38.   }  
  39.   public static void main(String[] args) {  
  40.     myCreate myCreate1 = new myCreate();  
  41.   }  
  42. }  

讀進一份XML file :
目前XML最常被拿來應用的領域之一大概就是當作設定檔,因此,如何從檔案中讀入一份已存在的XML更為重要. JDOM是利用SAX或DOM來剖析XML,用SAX會比DOM效率好且速度快 (更多比較請參考 這理),所以一般都是用SAX,如果對SAX不熟悉,可以在 http://www.saxproject.org/ 找到相關文件資料.
範例2就是用SAX建立Document,在建立SAXBuilder時傳入的參數指出是否用DTD驗正XML的合法性,true表示要,false表示不要。當呼叫build之後JDOM就已經幫我們用SAX建立好一棵XML Tree,如此我們就可以很方便由Tree中找到我們要的節點.
===== 範例 2 =====
  1. import org.jdom.*;  
  2. import org.jdom.input.*;  
  3. import org.jdom.output.*;  
  4. import java.io.*;  
  5. import java.util.List;  
  6.   
  7. public class myRead {  
  8.   public myRead() {  
  9.     Document docJDOM;  
  10.     //利用SAX建立Document  
  11.     SAXBuilder bSAX = new SAXBuilder(false);  
  12.     try {  
  13.       docJDOM = bSAX.build(new File("e:/myJDOM.xml"));  
  14.     }  
  15.     catch (JDOMException e) {  
  16.       e.printStackTrace();  
  17.       return;  
  18.     }  
  19.   
  20.     //在根節點中加入一個新的子節點  
  21.     Element elmtRoot = docJDOM.getRootElement();  
  22.     Element elmtChapter = new Element("Chapter");  
  23.     elmtChapter.setText("驗正XML");  
  24.     elmtChapter.setAttribute("sort", "4");  
  25.     elmtRoot.addContent(elmtChapter);  
  26.     //印出所有根節點的子節點  
  27.     List lstChildren = elmtRoot.getChildren("Chapter");  
  28.     for(int i=0; i
  29.       Element elmtChild = (Element) lstChildren.get(i);  
  30.       System.out.println("Child " + i);  
  31.       System.out.println("  Text:" + elmtChild.getText());  
  32.       System.out.println("  Attribute:" + elmtChild.getAttributeValue("sort"));  
  33.     }  
  34.   
  35.     //輸出到檔案  
  36.     OutputXML(docJDOM, "e:/myJDOM2.xml");  
  37.   }  
  38.   
  39.   private void OutputXML(Document docXML, String strFilename) {  
  40.     XMLOutputter fmt = new XMLOutputter();  
  41.     try {  
  42.       fmt.setEncoding("big5");  
  43.       fmt.setNewlines(true);  
  44.       FileWriter fwXML = new FileWriter(strFilename);  
  45.       fmt.output(docXML, fwXML);  
  46.       fwXML.close();  
  47.     }catch (IOException e) {  
  48.       e.printStackTrace();  
  49.     }  
  50.   }  
  51.   
  52.   public static void main(String[] args) {  
  53.     myRead myRead1 = new myRead();  
  54.   }  
  55. }  

轉換XML到HTML :
要將XML轉成HTML當然要先寫好XSL,但是即使寫好XSL,JDOM也並不提供XML轉換,幸好在JDOM安裝好之後,就會有Apache的Xalan,它可以幫我們做這樣的轉換. 要使用Apache 的 Xalan,首先確定 xalan.jar 在classpath裡。Xalan的第一個用法是在命令列執行,指令如下 :
C:\> java org.apache.xalan.xslt.Process –IN XML文件 –XSL XSL樣版 –OUT 輸出檔名

命令列的用法在一般的運用裡是很方便,但是我們有興趣的是在程式裡怎麼用。範例4提供了一個簡單的sample :
===== 範例 4 =====
  1. import javax.xml.transform.TransformerFactory;  
  2. import javax.xml.transform.Transformer;  
  3. import javax.xml.transform.TransformerException;  
  4. import javax.xml.transform.TransformerConfigurationException;  
  5. import javax.xml.transform.stream.*;  
  6.   
  7. public class myGenHTML {  
  8.   public myGenHTML(String strXML, String strXSL, String strHTML) {  
  9.     try {  
  10.       GenHTML(strXML, strXSL, strHTML);  
  11.     }catch (TransformerConfigurationException e) {  
  12.       e.printStackTrace();  
  13.     }catch (TransformerException e) {  
  14.       e.printStackTrace();  
  15.     }  
  16.   }  
  17.   private void GenHTML(String strXMLFile, String strXSLFile, String strHTMLFile) throws TransformerConfigurationException, TransformerException{  
  18.     TransformerFactory myFactory = TransformerFactory.newInstance();  
  19.     Transformer myTransformer = myFactory.newTransformer(new StreamSource(strXSLFile));  
  20.     myTransformer.transform(new StreamSource(strXMLFile), new StreamResult(strHTMLFile));  
  21.   }  
  22.   public static void main(String[] args) {  
  23.     myGenHTML myGenHTML1 = new myGenHTML(args[0], args[1], args[2]);  
  24.   }  
  25. }  

補充說明 :
* Java API for XML Code Samples
Java API for XML processing (JAXP) lets you access XML documents either serially (SAX) or in random access mode (DOM).
* DOM Examples
* SAX Examples
* XML Style Sheet language (XSLT) Examples
This message was edited 8 times. Last update was at 26/08/2011 16:33:32

[Git 常見問題] error: The following untracked working tree files would be overwritten by merge

  Source From  Here 方案1: // x -----删除忽略文件已经对 git 来说不识别的文件 // d -----删除未被添加到 git 的路径中的文件 // f -----强制运行 #   git clean -d -fx 方案2: 今天在服务器上  gi...