啟動另一項活動

完成上一堂課程時,您的應用程式已顯示一項活動,當中包含一個設有文字欄位和「傳送」按鈕的畫面。在本課程中,您將在 MainActivity 中加入一些程式碼,讓系統在使用者輕觸「傳送」按鈕後啟動新活動,以顯示一則訊息。

回應傳送按鈕

如要在 MainActivity 類別中新增使用者輕觸「傳送」按鈕時呼叫的方法,請按照下列步驟操作:

  1. 在位於 app > java > com.example.myfirstapp > MainActivity 的檔案中,新增以下 sendMessage() 方法虛設常式:

    Kotlin

    class MainActivity : AppCompatActivity() {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
        }
    
        /** Called when the user taps the Send button */
        fun sendMessage(view: View) {
            // Do something in response to button
        }
    }
    

    Java

    public class MainActivity extends AppCompatActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        }
    
        /** Called when the user taps the Send button */
        public void sendMessage(View view) {
            // Do something in response to button
        }
    }
    

    由於 Android Studio 無法解析當做方法引數使用的 View 類別,因此您可能會看到錯誤訊息。如要清除錯誤,請按一下 View 宣告並將遊標置於上方,然後按下 Alt+Enter 鍵 (在 Mac 上為 Option+Enter 鍵) 來執行快速修正作業。當畫面顯示選單時,請選取「Import class」(匯入類別)

  2. 返回 activity_main.xml 檔案,直接透過按鈕呼叫該方法:
    1. 在版面配置編輯器中選取按鈕。
    2. 在「Attributes」(屬性) 視窗中找到「onClick」屬性,然後從下拉式清單中選取「sendMessage [MainActivity]」

    現在只要使用者輕觸按鈕,系統就會呼叫 sendMessage() 方法。

    請記下這個方法的詳細資訊。系統需要透過這些資訊,才能確認這是與 android:onClick 屬性相容的方法。具體來說,此方法具有下列特性:

    • 公開存取權。
    • 如果使用 Kotlin,則為空白或隱式 unit 傳回值。
    • View 做為唯一參數。這是您在步驟 1 結束時點選的 View 物件。
  3. 接下來,請填入這個方法以讀取文字欄位的內容,然後將該文字傳送至其他活動。

建立意圖

Intent 物件可在執行階段為不同元件 (例如兩個活動) 提供繫結。Intent 代表應用程式執行特定行為的意圖。您可以將意圖用於各種不同的工作,但在本課程中,您的意圖會啟動另一項活動。

MainActivity 中新增 EXTRA_MESSAGE 常數和 sendMessage() 程式碼,如下所示:

Kotlin

const val EXTRA_MESSAGE = "com.example.myfirstapp.MESSAGE"

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }

    /** Called when the user taps the Send button */
    fun sendMessage(view: View) {
        val editText = findViewById<EditText>(R.id.editTextTextPersonName)
        val message = editText.text.toString()
        val intent = Intent(this, DisplayMessageActivity::class.java).apply {
            putExtra(EXTRA_MESSAGE, message)
        }
        startActivity(intent)
    }
}

Java

public class MainActivity extends AppCompatActivity {
    public static final String EXTRA_MESSAGE = "com.example.myfirstapp.MESSAGE";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    /** Called when the user taps the Send button */
    public void sendMessage(View view) {
        Intent intent = new Intent(this, DisplayMessageActivity.class);
        EditText editText = (EditText) findViewById(R.id.editTextTextPersonName);
        String message = editText.getText().toString();
        intent.putExtra(EXTRA_MESSAGE, message);
        startActivity(intent);
    }
}

請預期 Android Studio 可能會再次發生「Cannot resolve symbol」(無法解析符號) 錯誤。如要清除錯誤,請按下 Alt+Enter 鍵 (或 Mac 上的 Option+Return 鍵)。您最後應該進行以下匯入作業:

Kotlin

import androidx.appcompat.app.AppCompatActivity
import android.content.Intent
import android.os.Bundle
import android.view.View
import android.widget.EditText

Java

import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;

DisplayMessageActivity 仍有錯誤,但沒關係。您會在下一節中修正這個問題。

以下是 sendMessage() 的運作方式:

  • Intent 建構函式會採用兩個參數:ContextClass

    由於 Activity 類別是 Context 的子類別,因此會優先使用 Context 參數。

    系統會將 Intent, 傳送至應用程式元件的 Class 參數,也就是本例中要啟動的活動。

  • putExtra() 方法會將 EditText 的值加到意圖中。Intent 可攜帶鍵/值組合形式的資料類型 (稱為「額外項目」)。

    您的鍵是公開常數 EXTRA_MESSAGE,原因是下一項活動會利用這個鍵來擷取文字值。建議您在定義意圖額外項目的鍵時,使用應用程式的套件名稱做為前置字元。這樣做可確保應用程式與其他應用程式互動時,所有鍵都不會發生重複的情況。

  • startActivity() 方法會啟動由 Intent 指定的 DisplayMessageActivity 例項。接著,您必須建立該類別。

建立第二項活動

如要建立第二項活動,請按照下列步驟操作:

  1. 在「Project」(專案) 視窗中,在「app」(應用程式) 資料夾上按一下滑鼠右鍵,然後依序選取「New」(新增) >「Activity」(活動) >「Empty Activity」(空白活動)
  2. 在「Configure Activity」(設定活動) 視窗中的「Activity Name」(活動名稱) 欄位輸入「DisplayMessageActivity」。保留所有其他屬性的預設值,然後按一下「Finish」(完成)

Android Studio 會自動執行以下三項作業:

  • 建立 DisplayMessageActivity 檔案。
  • 建立與 DisplayMessageActivity 檔案相對應的版面配置檔案 activity_display_message.xml
  • AndroidManifest.xml 中新增必要的 <activity> 元素。

如果您執行應用程式並輕觸第一項活動中的按鈕,第二項活動就會開始執行,但會顯示空白。這是因為第二項活動使用的是範本所提供的空白版面配置。

新增文字檢視區塊

文字檢視區塊會置中顯示在版面配置頂端。
圖 1. 文字檢視區塊會置中顯示在版面配置頂端。

新活動會包含空白的版面配置檔案。如要在訊息顯示的位置新增文字檢視區塊,請按照下列步驟操作:

  1. 開啟位於 app > res > layout > activity_display_message.xml 的檔案。
  2. 按一下工具列中的「Enable Autoconnection to Parent」(啟用自動連結上層版面功能) 。這樣做可以啟用 Autoconnect (自動連結) 功能。請見圖 1。
  3. 在「Palette」 面板中,按一下「Text」(文字),然後將「TextView」(文字檢視區塊) 拖曳至接近版面配置頂端的中央,讓它對齊隨即顯示的垂直線。Autoconnect (自動連結) 功能會新增左/右邊界,藉此將檢視區塊水平置中。
  4. 從文字檢視區塊頂端到版面配置頂端再建立一個邊界,如圖 1 所示。

此外,您也可以視需要調整文字樣式,方法是在「Attributes」(屬性) 視窗的「Common Attributes」(常見屬性) 面板中展開「textAppearance」,然後變更相關屬性,例如「textSize」和「textColor」

顯示訊息

在此步驟中,您將修改第二項活動,以顯示第一項活動所傳遞的訊息。

  1. DisplayMessageActivity 中,將下列程式碼加到 onCreate() 方法中:

    Kotlin

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_display_message)
        
        // Get the Intent that started this activity and extract the string
        val message = intent.getStringExtra(EXTRA_MESSAGE)
    
        // Capture the layout's TextView and set the string as its text
        val textView = findViewById<TextView>(R.id.textView).apply {
            text = message
        }
    }
    

    Java

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_display_message);
        
        // Get the Intent that started this activity and extract the string
        Intent intent = getIntent();
        String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);
    
        // Capture the layout's TextView and set the string as its text
        TextView textView = findViewById(R.id.textView);
        textView.setText(message);
    }
    
  2. 按下 Alt+Enter 鍵 (或 Mac 上的 Option+Return 鍵),以匯入下列其他必要類別:

    Kotlin

    import androidx.appcompat.app.AppCompatActivity
    import android.content.Intent
    import android.os.Bundle
    import android.widget.TextView
    

    Java

    import androidx.appcompat.app.AppCompatActivity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.widget.TextView;
    

新增向上導覽功能

應用程式中每個非主要進入點的畫面 (也就是是主畫面以外的所有畫面) 都必須提供導覽機制,藉此將使用者導向至應用程式階層的邏輯上層畫面。如要這樣做,請在應用程式列中新增「向上」按鈕。

如要新增「向上」按鈕,您必須在 AndroidManifest.xml 檔案中宣告哪一項活動是邏輯上層。請開啟位於 app > manifests > AndroidManifest.xml 的檔案,找出 DisplayMessageActivity<activity> 標記,並替換成以下內容:

<activity android:name=".DisplayMessageActivity"
          android:parentActivityName=".MainActivity">
    <!-- The meta-data tag is required if you support API level 15 and lower -->
    <meta-data
        android:name="android.support.PARENT_ACTIVITY"
        android:value=".MainActivity" />
</activity>

Android 系統隨即會自動在應用程式列中新增「向上」按鈕。

執行應用程式

按一下工具列中的「Apply Change」(套用變更) 即可執行應用程式。應用程式開啟後,在文字欄位中輸入訊息,然後輕觸「傳送」,即可看到訊息顯示在第二項活動中。

應用程式已開啟,左側為輸入文字的畫面,右側則為顯示文字的畫面。
圖 2. 應用程式已開啟,左側為輸入文字的畫面,右側則為顯示文字的畫面。

就是這麼簡單,您已建立第一個 Android 應用程式!

如想繼續瞭解 Android 應用程式開發的基本概念,請返回「打造第一個應用程式」部分,並點選當中提供的其他連結。