作者:Vamei 出處:http://www.cnblogs.com/vamei 歡迎轉載,也請保留這段聲明。謝謝!
之前各講中,分別講解了安卓的開發環境、架構和基本概念。從這一講開始,我將制作一個簡單的應用,并通過逐步升級它的功能,連帶出安卓開發的多個情境。
《維納斯的誕生》是文藝復興早期名畫。相傳美神維納斯從海的泡沫中誕生,波提切利用大膽的筆觸描繪這一古典神話。畫面洋溢著對人體和美的熱愛。如果在中世紀或者西班牙宗教審判時期,這幅畫足夠波提切利上火刑架了。
任務描述
我將制作一個簡單的歡迎頁面。頁面中有一個按鈕。點擊后,將顯示制作人姓名。
知識點包括:
- 新建Activity:通過繼承Activity類,來創建一個新的類。
- 頁面布局:LinearLayout
- 按鈕點擊監:OnClickListener
- 臨時顯示簡單的文字信息:Toast用于顯示簡單的文字信息
編寫視圖
按照安卓第一夜 第一個應用中的介紹,創建一個Android項目Vamei,項目包的名字為me.vamei.vamei。
我將要創建一個頁面。這個頁面的視圖定義在res/layout/activity_main.xml中。從安卓第四夜 概念漫游(下)中,我們已經知道,這個XML文件描述了一個視圖樹。內容如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Welcome" /> <Button android:id="@+id/author" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/btn_text" /> </LinearLayout>
這里采用了線性布局LinearLayout,根據它的orientation的屬性"vertical",視圖元素將從上向下排列。線性布局中包含一個TextView,以及一個Button按鈕。TextView用于顯示文本"Welcome"。
視圖元素有layout_width和layout_height屬性,分別定義元素的寬度和高度。這兩個屬性可以是具體的數值,比如"10px",也可以是:
- "match_parent":與母元素相同
- "wrap_content":與包含的內容相同,如文字本身的尺寸
Button還有一個id,即author。在程序中我們可以借用這個id來引用該按鈕。Button上文本是一個字符串。注意符號@,表示這里引用了一個名為btn_text的字符資源。我們當然可以像"Welcome"那樣直接使用一個字符串,但引用字符資源有額外的好處。我們可以在程序的多處重復利用的同一個資源條目,從而便于修改。該字符串保存在res/values/strings.xml中:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Vamei</string>
<string name="action_settings">Settings</string>
<string name="author">vamei</string>
<string name="btn_text">who am I</string>
</resources>
可以看到,名為btn_text的字符串資源為"who am I"。
編寫Activity
上面XML定義的視圖是靜態的。想要實現動態的應用,我還需要一個配套的Activity。在src文件夾下的me.vamei.vamei包中,會有一個MainActivity.java。這個Java文件中包含一個MainActivity類,繼承自Activity。我將其中的代碼修改為:
package me.vamei.vamei;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// attach view tree to the activity
setContentView(R.layout.activity_main);
// monitor "click" action for the button
Button btn = (Button) findViewById(R.id.author);
btn.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view) {
Toast.makeText(MainActivity.this,
getString(R.string.author),
Toast.LENGTH_LONG).show();
}
});
}
}
在這個類中,我只包含了一個onCreate()方法。當應用啟動時,安卓將調用onCreate()方法。該方法有一個Bundle類型的參數,記錄Activity的狀態,我將在以后講解。
onCreate()方法中主要做了兩件事:
- 連接Activity與視圖樹。setContentView()方法為Activity增加了視圖樹。這里引用了activity_main.xml中的視圖樹。可以注意到,安卓中用R來代表資源。
- 監聽按鈕的點擊事件。因為我們在activity_main.xml中定義了按鈕的id,所以可以使用findViewById方法,便捷的引用按鈕。View元素可以使用setOnClickListner()方法,為點擊事件增加OnClickListener類型的監聽對象。
用戶點擊按鈕后,安卓將執行監聽對象的onClick()方法。該方法利用Toast,顯示一段文本,即R.string.author對應的字符串資源。在res/values/strings.xml中,已經定義該字符串為"vamei"。Toast是一個彈出的文字顯示框。makeText()的三個參數分別為彈出框的Context、要顯示的字符串和顯示時間。
注冊Activity
已經完成的Activity需要在AndoriManifest.xml中注冊。這是安卓應用的配置文件,可以進行許多權限相關的設定。我的AndroidManifest.xml如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="me.vamei.vamei"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="19" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="me.vamei.vamei.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
可以看到<activity>標簽中注冊了MainActivity。<Activity>中還定義了該Activity的Intent Filter,即愿意接收的Intent。
運行
運行應用,效果如下:
好吧,這個界面離維納斯還有點距離……
總結
一個單頁Activity
LinearLayout, TextView, Button
layout_width, layout_height, "wrap_content", "match_parent"
setContentView()
setOnClickListener()
Toast.maketext()
<activity>
歡迎繼續閱讀“Java快速教程”系列文章
文章列表