安卓第五夜 維納斯的誕生

Vamei發表於2014-08-07

作者: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_widthlayout_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()方法中主要做了兩件事:

  1. 連線Activity與檢視樹。setContentView()方法為Activity增加了檢視樹。這裡引用了activity_main.xml中的檢視樹。可以注意到,安卓中用R來代表資源。
  2. 監聽按鈕的點選事件。因為我們在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快速教程”系列文章

 

相關文章