網頁

2009年9月14日 星期一

修改HelloWord的顯示字樣

上一篇文章中我們希望能夠透過程式來修改HelloWord的顯示字樣,
要修改HelloWord字樣之前,我們先介紹一下表單xml與程式之間的連結
到現在我們已經會產生新的表單,與表單上加入新的物件,但是我們還沒有辦法
與表單上得物件做任何互動,程式要與表單物件產生互動,慣例上(API SAMPLE都這麼做)
要先建立一個物件,並且將物與表單物件連結,寫法如下

物件類別 名稱;
名稱 = (物件類別)findViewById(R.id.表單物件名稱);
或是

物件類別 名稱 = (物件類別)findViewById(R.id.表單物件名稱);

例如按鈕物件
Button Bt1;
Bt1 = (Button)findViewById(R.id.Button01);
或是Button Bt1 = (Button)findViewById(R.id.Button01);
宣告Bt1為按鈕物件,連結表單上的Button01
顯示文字物件
TextView TV1 = (TextView)findViewById(R.id.TextView01);
宣告TV1為顯示文字物件,連結表單上的TextView01
圖形顯示物件
ImageView IV1 = (ImageView)findViewById(R.id.ImageView01);
宣告TV1為顯示文字物件,連結表單上的ImageView01
圖形按鈕物件
ImageButton IB = (ImageButton)findViewById(R.id.ImageButton01 );
宣告TV1為顯示文字物件,連結表單上的ImageButton01


當我們打下 Button Bt1 = (Button)findViewById(R.id.Button01);
會發現這一行程式的左方出現了一個燈泡,上面畫了x 表示這一行語法錯誤了
Eclipse是一套非常強大的程式語言編輯器,當你在寫程式的過程當中他就已經在幫你debug
以往我們開發程式,都必須到編譯時候,編譯器才會告訴我們那一行程式出錯,
Eclipse不用等到編譯時期,每當我們打完一些字,他就已經幫我們掃描我們打的語法是否正確
當我們打下按鈕物件,Eclipse立刻說這一行有問題,所以在左方打上一個x
Eclipse更貼心的是他會把他看到錯誤的地方,下標波浪紅線,滑鼠只要移動到該地方,
就會說明錯誤原因,並且提議修正方法(真是太貼心了,難以形容當初用筆記本開發程式的痛苦)
這個錯誤Button cannot be resolved to a type
找不到這個類別,所以他建議,第一項引入 Button 物件,第二項自行建立類別
我們選擇第一項,我們發現程式碼自動加入
import android.widget.Button;
(喔!我都快要尖叫了,這秘書真厲害,不知道他們會不會知道我要寫遊戲
,自動幫我寫下程式碼,我只要想就好了,哈哈哈)

事實上自動引入物件函數可以使用快速鍵 ctrl + shift + o可以達到一樣的功能,
還有一個自動完成的功能,例如你忘了指令findViewById 你打下findV時忘了後面怎麼打
這時候只要按下 alt + / 就會發現,哇,他幫我寫下了findViewById,真是太感動了
Eclipse感動的地方不只如此,我只能說這樣寫程式真是享受阿~~~~~~~~~~


關於layout上新增或刪除物件,R.java 並不會更新id裡的物件
當我們使用R.id.的時候Eclipse列出R.java裡所蒐集的表單物件,
但是當我們試著新增一個按鈕,R.java並沒有幫我們把按鈕的id加到R.java裡面
就算我們把R.java Refresh也並沒有看到ButtonXX新增到R.java裡面,
經過了一番嘗試之後,發現只要雙點 表單.xml就可以立刻更新R.java 的id




現在Bt1代表著表單上的按鈕,現在我們就可以透過Bt1對這個物件做任何控制,怎麼控制呢
有什麼可以控制呢? 我們打下Bt1. 哇跳出一堆選項這些選項,就是該物件可以使用的方法,
那麼多方法,一下子還真不知道該怎麼辦,其實我們只會使用到某些方法,不可以所有方法都瞭解
畢竟我們是創作程式,不是研究程式,今天我們使用一個最常用的吧
Bt1.setText("按我按我"); , 看字面上的字意就知道為設定按鈕文字。

我們看到,按鈕上得文字已經由原本的Button01改成按我按我,
那按下去之後,程式怎麼知道使用者按了這個按鈕呢?

如果需要物件回饋訊號讓程式判斷,就需要註冊事件,怎麼註冊呢
按鈕物件名稱.setOnClickListener(new Button.OnClickListener()
{
public void onClick(View v)
{
//按了之後的程式碼
}
});

一開始學習,會覺得如此的不習慣,但是,用久了就會發現這只是Android的程式特性
需要慢慢習慣,我寫了可以讓按鈕長大的方法,玩玩看挺好玩的。

3: import android.app.Activity;
4: import android.os.Bundle;
5: import android.view.View;
6: import android.widget.Button;

8: public class HelloWordActivity extends Activity {
9: /** Called when the activity is first created. */
10: @Override
11: public void onCreate(Bundle savedInstanceState) {
12: super.onCreate(savedInstanceState);
13: setContentView(R.layout.main);
14: final Button Bt1 = (Button)findViewById(R.id.Button01);
15: Bt1.setText("按我按我");
16:
17: Bt1.setOnClickListener(new Button.OnClickListener()
18: {
19: public void onClick(View v)
20: {
21: Bt1.setText("我被按了");
22: Bt1.setHeight(Bt1.getHeight() +10);
23: }
24: });
25: }
26: }


講了一大圈,大該知道只要對HelloWord的TextView 使用 SetText() 就可以改變文字
但是使用 findViewById 卻沒有發現HellWord的任何TextView物件,這是因為HelloWord的
TextView物件,關閉了連結,我們需要自行輸入,打開main.xml 看到下方

少了一個屬性
android:id="@+id/TextView01"
把這一行加進去


然後雙點main.xml 讓R.java 更新,我們發現id裡增加了TextView01物件
接下來如上泡制一番,我們希望按了按鈕之後,helloword字樣變成 "按,按什麼按~"
程式碼如下
   1: package com.helloword;

3: import android.app.Activity;
4: import android.os.Bundle;
5: import android.view.View;
6: import android.widget.Button;
7: import android.widget.TextView;

9: public class HelloWordActivity extends Activity {
10: /** Called when the activity is first created. */
11: @Override
12: public void onCreate(Bundle savedInstanceState) {
13: super.onCreate(savedInstanceState);
14: setContentView(R.layout.main);
15: final Button Bt1 = (Button)findViewById(R.id.Button01);
16: final TextView TV1 = (TextView)findViewById(R.id.TextView01);
17: Bt1.setText("按我按我");
18:
19: Bt1.setOnClickListener(new Button.OnClickListener()
20: {
21: public void onClick(View v)
22: {
23: Bt1.setText("我長大囉~");
24: Bt1.setHeight(Bt1.getHeight() +10);
25: Bt1.setWidth(Bt1.getWidth() +10);
26: TV1.setText("按,按什麼按~");
27: }
28: });
29: }
30: }
哈哈我們已經成功的掌控,HelloWord 會不會有點囧呢,玩了這麼久,才只會玩HelloWord
事實上我們是再一點一滴,了解Eclipse的特性,和Android的程式架構.



2009年9月10日 星期四

關於程式架構

   1: package HelloWord.com;

3: import android.app.Activity;
4: import android.os.Bundle;

6: public class HelloWord extends Activity {
7: /** Called when the activity is first created. */
8: @Override
9: public void onCreate(Bundle savedInstanceState) {
10: super.onCreate(savedInstanceState);
11: setContentView(R.layout.main);
12: }
13: }

這是Helloword的程式碼? 他到底在說什麼呢,這幾行程式碼其實很簡單看起來很複雜
我註解一下
   1: package HelloWord.com;
3: import android.app.Activity; //宣告
4: import android.os.Bundle; //宣告

6: public class HelloWord extends Activity {//程式活動範圍
7: /** Called when the activity is first created. */
8: @Override
9: public void onCreate(Bundle savedInstanceState) { //當Create時
10: super.onCreate(savedInstanceState);
11: //『Create』事件裡把參數savedInstanceStatePass給父物件作原始的處理
,不過如果這一常程式碼沒有感覺也沒有關係 當作沒看到,但是不可以幹掉......

12:
13: setContentView(R.layout.main);//把Main.xml 顯示出來

15: }
16: }


更簡化如下
   1: /*
2: 宣告
3: 程式活動範圍
4: {
5: 當程式Create時
6: {
7: 把MAIN.xml顯示出來
8: }
9: }
10: */


ㄟ....原來HelloWord 這麼簡單阿,簡單來說這個程式什麼事情都沒作,只寫了一行程式碼
當Create的時候
setContentView(R.layout.main); <--把Main.xml 顯示出來。 看懂這裡的程式,心裡一定有很多疑問
  1. .如果說一個xml代表一個表單,是不是我建立一個表單的xml 那使用setContentView(我的比單) 就可以顯示新的表單呢?
  2. onCreate 叫做『當建立時候』那什麼時候會建立呢,程式啟動的時候嗎?
  3. 這是一個HelloWord我可以透過程式的方法去更改HelloWord的字樣嗎
  4. 除了onCreate 事件之外還有其他什麼事件?他們該怎麼打阿, 一個onCreate裡面我怎麼知道要打上super.onCreate(savedInstanceState); 這些該不會要我背起來吧....還是每次都要打一堆這些指令呢?
第一個問題是肯定的,我們做了以下的實驗,我們首先在 res\layout增加一個Android XML
卻出現了一個錯誤,心裡忽然冒出一陣&︿*(%︿&
後來試了一下使用畫面上這個按鈕,就可以避開這個錯誤,增加Android xml 請使用這個按鈕

輸入檔案名稱,注意名稱必須 有.xml
又出現錯誤了
[2009-09-13 12:59:08 - HelloWord] res\layout\NewXml.xml: Invalid file name: must contain only [a-z0-9_.]
[2009-09-13 12:59:08 - HelloWord] Unknown error:
原來名稱只能有小寫和數字,改一下名稱,並且在新的表單中加入一些物件
我加入了兩個可愛的小時鐘
然後程式碼加入
setContentView(R.layout.newxml);
在main的下方,這樣代表先顯示main然後再顯示我們的表單
不過執行起來沒機會看到main就被我們的覆蓋了,下一章我們再來寫一個
按了按鈕就切換表單。
那問題 234呢....黑.....

2009年9月9日 星期三

從HelloWord改起吧

記得學習程式語言的開始,都是從修改範例開始
有時候根本不知道為什麼,只是知道這樣寫可以達到某種功能
接著就開始修改他,經由修改可以瞭解其中的意義,就算不瞭解,也知道怎麼去使用他
我們先從修改HelloWord開始玩起吧,這個程式執行之後畫面上就一個HelloWord
如果說那我把HelloWord填入一本小說的文字,那這個程式瞬間就變成一個小說閱讀器
不是超酷的嗎~~!!!!!
先到網路上找篇文章來貼吧
找到文章之後,打開程式碼HelloWord.java 哇勒 怎麼沒有看到任何Helloword的字眼
嗯我先稍微的介紹一下,Android的檔案架構吧,
左方我們看到
Src 這裡放原始檔的地方
res 存放資源的地方
資源什麼東西叫做資源呢
舉凡程式使用到的圖片 . 音樂 . 常數 . 還有表單 都放在這裡
表單又是什麼?表單多說無益,你點兩下main.Xml 喔你看到了程式執行畫面
是的 他就是執行畫面,上面可以擺按鈕,文字,還有多說無益,一樣的你把左邊的元件
拖到畫面中,他就會建立物件了,右邊的視窗顯示現在這個表單裡面所有元件的列表
建議你拖拉一個物件叫做AnalogClock 很誇張,一個時鐘ㄟ,這個物件真奇怪阿,哈哈
不過相信你很快就會跟我有一樣的感覺,我想要時鐘移動位置,
我想要按鈕放在我想要的地方,不能托移ㄟ,好難用阿...................
這個往後在介紹吧,先瞭解main,xml就是表單,當然一個程式可能有許多表單
你一定猜到,所有表單都會放在這裡,且他都是xml檔案

如何修改Hellword 剛剛看到Hellword在表單上了,可是我怎麼樣都不能去修改他阿,
點選了main.xml 只看到
android:text="@string/hello"
/>
這代表什麼意思呢,剛剛我們提到資源檔中,可以存放常數,@string/hello
就是提取常數字串名稱為hello中的文字
hello就放在strings.xml 中,打開string.xml可以使用他提供的修該方式,或是我們直接打開
strings.xml文件直接修改,貼上我們的文字吧,然後執行看看,
果真可以顯示好多文字,可是很快得就發現奇怪的地方,都黏在一起,不換行喔,且文字超出去的部份都看不到了,不過沒關係,我們成功的修改文字了。

我介紹一下,文字換行怎麼換
文字要換行需要打上 \n 有學過C語言 或是PHP 或是java都不陌生 這個叫做 跳脫字元
就是專門跳脫衣舞的字元,冷.......... 不是啦就是跳脫顯示而成為特殊用途的字元(自己亂掰掰的)
跳脫字元還有\t 可以打出Table \b返回 還有其他請用
跳脫字元當作關鍵字Google一下就瞭解有哪些,多說無益,你試了就知道\什麼東西是作什麼用的,自己動作玩才記得牢固。







2009年9月7日 星期一

Android如何載入別人程式碼或是範例程式

當我們第一次看到Android模擬器執行成功,想當然而會在模擬器上把玩一番
用他的瀏覽器上上網,感覺比電腦慢且螢幕不大不是很好用,但是還是上了一下網頁
看一下哪些網頁顯示正常,哪些他沒辦法. 試著打模擬器的電話,不過只有畫面,不可能撥出去
試著試著就想看看一些別人的範例,看看android可以寫出什麼東西,
SDK裡副了一些範例,其實我們寫程式的,有時候看到程式碼勝過千言萬語,
雖然看別人的程式碼是很痛苦的一件事情,廢話不多說,來吧欣賞別的作品了
阿勒....
Eclipse載入別人的專案,不太直覺,不是open喔, 是
[File->New->Android Project]

New Android Project 視窗中選擇
Create Project from existing source 在點選 Browse 開啟專案所在的資料夾,如果該資料夾裡面有完成的Android專案,就會發現在點選確定之後,Application name Project name 會自動填上名字
(SDK的範例放在 "你的sdk資料夾\platforms\android-1.5\samples )
打開範例就個人喜好亂看,但是我喜歡遊戲,推薦打開\LunarLander這個範例,
這是一個登入月球的遊戲,他是一個很玩整的遊戲喔,裡面有google大神教我們如何寫動作遊戲的
基礎架構呢,所以我們會往該遊戲繼續研究下去.

但是新手總是碰壁連連阿,好不容易可以載入專案,可是卻不能執行,
出現如下錯誤
no classfiles specified
Conversion to Dalvik format failed with error 1


遇到這樣的狀況,兩個方法可以解決
1.刪除gen下 的R.java 刪除後他會自動重新建立
2.關閉Eclipse然後再重新開啟
這樣就可以解決該問題,然後再度執行他, ya 成功了, android上的遊戲就是如此的美妙阿.......
想像一下他未來就可以在我的手機上執行耶,我可以創造任何程式,就像在電腦上執行一樣,
且我的程式可以讓全世界的人都看到喔,挖全世界ㄟ,這跟很多畫家的夢想一樣,我想要畫一副好大好大的畫,給全世界的人都看到,哈哈做完白日夢,更有想要繼續學習下去的動機,是的永遠都不要忘記學習跟創作是一件非常快樂的事情.......