2014年12月14日 星期日

開啟另一個活動(Activity)

開啟另一個活動(Activity)
原文詳 https://developer.android.com/training/basics/firstapp/starting-activity.html#BuildIntent


回應"Send"按鈕

1. 在 res/layout 路徑下編輯 activity_main.xml 檔案。
2. 在 <Button> 元素內加入 "android:onClick" 屬性。
activity_main.xml 內容看起來應如下:

<Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/button_send"
        android:onClick="sendMessage"/>

此 "android:onClick" 屬性的值 "sendMessage"它是一個方法(method),當使用者按下按鈕時會去執行這個方法。

3. 到 "java/com.example_xxx/myapplication1" 路徑下開啟 MainActivity.java。
4. 在 MainActivity 類別(class)下加入一個 "sendMessage()" 方法(method),如下所示:

 public void sendMessage(View view) {
        // Do something in response to button
 }

為了讓系統能配合這個方法,您必須符合如下規定:

1. 方法必須為全域(public)。
2. 需要有一個 void 的返回值。
3. 需要有一個 View 的參數。


建立一個意圖(Intent)

所謂"意圖(Intent)",就是在按下按鈕之後所要做的事。

1. 在 MainActivity.java 的 sendMessage() 方法內部建立一個意圖,在這兒我們要啟用另一個叫做 "DisplayMessageActivity" 的活動(Activity)。程式碼如下所示:

public void sendMessage(View view) {
        Intent intent = new Intent(this, DisplayMessageActivity.class);
}

注意:你會發現程式中出現紅色的文字,表示目前這兒有一些錯誤,這是因為我們目前尚未建立 "DisplayMessageActivity" 這個類別。目前您可以先忽視這個錯誤,稍後我們將會建立這個類別。

這個架構使用到兩個參數:

  • Context 作為 new Intent 的第一個參數(之所以使用 this 是因為 Context 的次類別是 Activity)。
  • App 的 Class 部件會用來驅動 Intent ,在這兒將會啟用一個 Activity。


2. 在檔案的頂端加入這一行

import android.content.Intent;

提示:同時按下<Alt>+<Enter>鍵可以自動匯入(import)遺失的類別(class)。

3. 在 sendMessage() 方法裏使用 findViewById 以取得 EditText 元件。
4. 在檔案的頂端加入這一行

import android.content.Intent;

你也可以同時按下<Alt>+<Enter>鍵自動匯入(import) EditText 類別。

5. 取得使用者輸入的內容,將值指定給區域變數 message。並且使用 putExtra() 方法將 message 這個值加到 Intent 裏。
MainActivity.java 內容看起來應如下:

public void sendMessage(View view) {
        Intent intent = new Intent(this, DisplayMessageActivity.class);
        EditText editText = (EditText) findViewById(R.id.edit_message);
        String message = editText.getText().toString();
        intent.putExtra(EXTRA_MESSAGE, message);
}

6. 在 MainActivity 類別的頂端加入 "EXTRA_MESSAGE"的定義,如下:

public class MainActivity extends ActionBarActivity {
    public final static String EXTRA_MESSAGE = "com.mycompany.myfirstapp.MESSAGE";
    ....

7. 在 sendMessage() 方法內呼叫 startActivity() 方法,把這個 Intent 傳送出去,如下:

public void sendMessage(View view) {
        Intent intent = new Intent(this, DisplayMessageActivity.class);
        EditText editText = (EditText) findViewById(R.id.edit_message);
        String message = editText.getText().toString();
        intent.putExtra(EXTRA_MESSAGE, message);
        startActivity(intent);
}

系統接收到這個呼叫之後,會開始一個 Intent 指定的 Activity 實例,現在你需要去建立一個 DisplayMessageActivity 類別,為了這事來工作。


建立第二個活動(Activity)

所有的 Activity 次類別都必須實作 onCreate()方法,可以使用這個方法來接收 Intent 傳遞過來的資訊,同時必須在 onCreate() 方法內使用 setContentView() 方法來激活佈局,

使用 Android Studio 建立一個新的活動(Activity)

1. 在 Android Studio 的 java 路徑下選擇 com.example.myapplication1,按下滑鼠右鍵並選取 New > Activity > Blank Activity
2. 在 選擇視窗內填入下列資料:

Activity Name = DisplayMessageActivity
Layout Name = activity_display_message
Title = DisplayMessageActivity
Hierarchical Parent = com.example.myapplication1.MainActivity
Package name = com.example.john.myapplication1

按一下 [Finish] 鍵。

3. 雙擊 DisplayMessageActivity 開啟程式碼視窗。

4. 移除 onCreateOptionsMenu() 方法。


建立活動

1. 在 src/ 路徑下建立一個新檔案 DisplayMessageActivity.java,


3. 到 strings.xml 內加入這一行

<string name="title_activity_display_message">My Message</string>

4. 雙擊 manifests 在 <Application> 裏面為 DisplayMessageActivity 這個類別加入 <activity> 宣告,如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.john.myapplication1" >

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".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>
        <activity
            android:name=".DisplayMessageActivity"
            android:label="@string/title_activity_display_message"
            android:parentActivityName=".MainActivity" >
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value="com.example.john.myapplication1.MainActivity" />
        </activity>
    </application>

</manifest>


接收意圖

1. 編輯 DisplayMessageActivity.java 檔案。
2. 移除 onCreate() 方法裏面的這一行

setContentView(R.layout.activity_display_message);

3. 取得意圖,並將他指定給 intent 區域變數。

Intent intent = getIntent();

4. 在檔案的頂端加入這一行

import android.content.Intent;

你也可以同時按下<Alt>+<Enter>鍵自動匯入(import) EditText 類別。

5. 使用 getStringExtra() 方法萃取從 MyActivity 傳遞過來的訊息。

String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);


顯示訊息

1. 在 onCreate() 方法內建立 TextView 物件。

 TextView textView = new TextView(this);

2. 使用 setText() 方法設定文字大小和內容。

textView.setTextSize(40);
textView.setText(message);

3. 利用 setContentView() 方法將 textView 傳送到最底層的活動佈局裏。
4. 在檔案的最頂端加入

import android.widget.TextView;

完整的 onCreatet() 方法程式碼如下:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Get the message from the intent
        Intent intent = getIntent();
        String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);

        // Create the text view
        TextView textView = new TextView(this);
        textView.setTextSize(40);
        textView.setText(message);

        // Set the text view as the activity layout
        setContentView(textView);
}


現在你可以執行這個 App 了,畫面如下:



















沒有留言:

張貼留言