Google的Android SDK發布也有一段時間了,一直想研究一下卻苦於找不到時間。利用這個周未,開始強迫自己再次進入學習狀態,原因很簡單:我看好開放的gPhone。
SDK的下載與安裝並不複雜,網上也有不少同學已經進入狀態了,我就不再重複了吧。
今天主要討論的,還是永遠不變的話題:Hello World.
1.最簡單的HelloWorld
安裝了SDK後,直接產生一個Android Project,一句代碼不用寫,就能跑出一個最簡單的HelloWorld常式。
我們看一下它的代碼:public void onCreate(Bundle icicle) ...{
super.onCreate(icicle);
setTheme(android.R.style.Theme_Dark);
setContentView(R.layout.main);
}
看上去實在很簡單,只有兩句話而已。關鍵在這個R.layout.main上,憑直覺,這應該是定義的資源。的確,在R.java中只是定義了一個static int 而已,真正的資源描述在res/layout/main.xml檔案裡(注意:這裡的R.java不要手工編輯,每次build project時它都會根據res下的資源描述被自動修改)。<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView id="@+id/txt"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Hello World"
/>
</LinearLayout>
這個檔案很好讀,一個<LinearLayout>描述了這是一個線性排列的布局,android:orientation=vertical表示所有組件將縱向排布。而經典的Hello World是用一個TextView來展示的。
由此,我們知道,Android的程式從一個Activity派生出來,並且從它的onCreate開始啟動;Android裡要顯示的組件用XML檔案描述而不用在代碼中寫入程式碼(這是一個好的習慣,我們應該從一開始就堅持下去);
2.讓Button來說Hello World
上面的例子是ADT自動產生的程式碼,似乎與我們一點關係也沒有。那我們來改一下代碼,因為在windows平台上的Helloworld經常是由一個按鈕觸發的,所以,我們想第二個Helloworld應該是這樣的:加一個按鈕和文本輸入框,單擊按鈕後在原來的TextView後面加上輸入框中輸入的文字。
第一步是,增加一個Button和一個EditText,與TextView一樣,它們也在main.xml裡描述一下: <EditText id="@+id/edt"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text=""
/>
<Button id="@+id/go"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:text="@string/go">
<requestFocus />
</Button>
這裡有兩個地方要注意:id=@+id/go,這表示需要一個唯一的UID來作為Button的ID,它的引用名是go。還有一個是android:text=@string/go表示這個按鈕的文本不是直接寫有main.xml裡了,而是來源於另一個資源描述檔案strings.xml裡,本例中的strings.xml如下:<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">helloTwo</string>
<string name="tit_dialog">提示</string>
<string name="msg_dialog">你好,中國</string>
<string name="ok_dialog">確定</string>
<string name="go">瀏覽</string>
</resources>
然後,在代碼裡(onCreate函數中)我們加上以下代碼(簡單起見,用了嵌套類):Button btn = (Button)findViewById(R.id.go);
btn.setOnClickListener(new View.OnClickListener()
...{
public void onClick(View v)
...{
EditText edt=(EditText)helloTwo.this.findViewById(R.id.edt);
TextView txt= (TextView)helloTwo.this.findViewById(R.id.txt);
txt.setText(getString(R.string.msg_dialog)+edt.getText());
}
});
為銨鈕增加一個onClick事件處理器,在點擊事件中,設定txt的文本為R.string.msg_dialgo+edt.getText()。
這裡的關鍵是兩個函數的使用: findViewById(R.id.go)可以根據資源的名稱載入View類型的資源,同樣用函數getString(R.string.msg_dialog)可以載入字串資源。
編譯,run一下看看效果。
3. 再讓菜單Say Hello
從API文檔中我們看到Activity中有兩個函數:onCreateOptionsMenu和onOptionsItemSelected,顯示,這個OptionsMenu就是所謂的操作功能表(在GPhone的模擬器上,有個鍵專用於彈出這個菜單)。下面我們就為這個HelloWorld例子加上一個菜單,並且讓它可以Say hello。
這次,我們不涉及到資源的描述檔案了,而是直接使用這兩個函數來實現,其實代碼也很簡單,所以,我們再增加一個退出應用的功能(否則每次都是按取消鍵退出應用顯示太不專業了)。
代碼如下: public boolean onCreateOptionsMenu(Menu menu)
...{
super.onCreateOptionsMenu(menu);
menu.add(0,1,"say hello");
menu.add(0,2,"exit");
return true;
}
public boolean onOptionsItemSelected(Item item)
...{
super.onOptionsItemSelected(item);
int id = item.getId();
switch(id)...{
case 1:
AlertDialog.show(this,getString(R.string.app_name),
getString(R.string.msg_dialog), getString(R.string.ok_dialog), true);
break;
case 2:
finish();
break;
}
在CreateOptionsMenu時,我們簡單地增加兩個功能表項目,menu.add(組ID,項ID,顯示文本),(注意:這裡我直接將文字寫在代碼裡,這並不提倡)。然後,在OptionsItemSelected事件中,我們根據選中的功能表項目做相應處理,如果選中1,則彈出一個對話方塊顯示資源檔中的“你好,中國”,如果選中2則退出應用。
AlertDialog.show是一個靜態方法,類似於我們在WIN平台上經常使用的MessageBox一樣,很方便的。
好了,今天是第一天,先學到這裡吧,下回我覺得我有必要仔細研究一個Activity的API了。