在前幾篇的 “啟動新 Activity” 中,介紹如何在舊 Activity 中啟動新的 Activity,如果情況是 Activity 互相切換甚至它們還能傳送數值,要如何做到呢? 很簡單,一樣使用 Intent 設定要切換的 Activity ,接著利用 Bundle 綁定數值,就能達到目的了,以下建立 2 個 Activity
第 1 個 MainActivity
package com.example.androidtestproject; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; public class MainActivity extends Activity { Button bright; TextView tv1; int num; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Bundle b = this.getIntent().getExtras(); if (b != null) { num = b.getInt("num"); } tv1 = (TextView) findViewById(R.id.text1); tv1.setText("MainActivity1: " + num); bright = (Button) findViewById(R.id.buttonright); bright.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub Bundle b = new Bundle(); num++; b.putInt("num", num); Intent inte = new Intent(); inte.setClass(MainActivity.this, MainActivity2.class); inte.putExtras(b); startActivity(inte); MainActivity.this.finish(); } }); } }
第 23 行的 R.layout.activity_main 內容如下,裡面只有 1 個按鈕,和 1 個 TextView
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:id="@+id/text1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:text="@string/hello_world" tools:context=".MainActivity" /> <Button android:id="@+id/buttonright" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_alignParentRight="true" android:text="activity2" /> </RelativeLayout>
第 25 ~ 28 行為取得從 MainActivity2 傳來的資料,注意第 26 行檢查 b 是否為 null , 因為在啟動程序時並不會有數值傳送,如果沒有檢查第 27 行就會出現錯誤
第 41 ~ 43 行為建立 Bundle 物件 b , 並放入數值 num , 放入的方式是 key – value 對應,在另 1 個 Activity 中取得數值時也必須藉由 key 來取得
第 45 ~ 46 行為設定切換的 Activity , 第 1 個參數為自己本身, 第 2 個參數為另 1 個 Activity
第 47 行將第 41 行建立的 b 放入以便傳送
第 49 行開始切換
接著是第 2 個 MainActivity 的內容
package com.example.androidtestproject; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; public class MainActivity2 extends Activity { Button bright; TextView tv1; int num; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2); Bundle b = this.getIntent().getExtras(); num = b.getInt("num"); tv1 = (TextView) findViewById(R.id.text2); tv1.setText("MainActivity2: " + num); bright = (Button) findViewById(R.id.buttonright); bright.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub Bundle b = new Bundle(); num++; b.putInt("num", num); Intent inte = new Intent(); inte.setClass(MainActivity2.this, MainActivity.class); inte.putExtras(b); startActivity(inte); MainActivity2.this.finish(); } }); } }
內容和第 1 個 MainActivity 相當類似,只差沒有檢查 b 是否為 null , 因為這個 Activity 預設並不會先啟動,一定會有 Activity 傳資料給它
結果為
一開始的 Activity 畫面,數值為 0
點選右下方的 button 之後,數值增加