開啟另一個活動(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 了,畫面如下: