Activity 之間的切換與傳送資料(Activity+Bundle)


在前幾篇的 "啟動新 Activity" 中,介紹如何在舊 Activity 中啟動新的 Activity,如果情況是 Activity 互相切換甚至它們還能傳送數值,要如何做到呢? 很簡單,一樣使用 Intent 設定要切換的 Activity ,接著利用 Bundle 綁定數值,就能達到目的了,以下建立 2 個 Activity

第 1 個 MainActivity

   1:  package com.example.androidtestproject;
   2:   
   3:  import android.app.Activity;
   4:  import android.content.Intent;
   5:  import android.os.Bundle;
   6:  import android.view.Menu;
   7:  import android.view.View;
   8:  import android.view.View.OnClickListener;
   9:  import android.widget.Button;
  10:  import android.widget.TextView;
  11:   
  12:  public class MainActivity extends Activity {
  13:   
  14:      Button bright;
  15:   
  16:      TextView tv1;
  17:   
  18:      int num;
  19:   
  20:      @Override
  21:      public void onCreate(Bundle savedInstanceState) {
  22:          super.onCreate(savedInstanceState);
  23:          setContentView(R.layout.activity_main);
  24:   
  25:          Bundle b = this.getIntent().getExtras();
  26:          if (b != null) {
  27:              num = b.getInt("num");
  28:          }
  29:   
  30:          tv1 = (TextView) findViewById(R.id.text1);
  31:   
  32:          tv1.setText("MainActivity1: " + num);
  33:   
  34:          bright = (Button) findViewById(R.id.buttonright);
  35:          bright.setOnClickListener(new OnClickListener() {
  36:   
  37:              @Override
  38:              public void onClick(View v) {
  39:                  // TODO Auto-generated method stub
  40:   
  41:                  Bundle b = new Bundle();
  42:                  num++;
  43:                  b.putInt("num", num);
  44:   
  45:                  Intent inte = new Intent();
  46:                  inte.setClass(MainActivity.this, MainActivity2.class);
  47:                  inte.putExtras(b);
  48:   
  49:                  startActivity(inte);
                       MainActivity.this.finish();
  50:              }
  51:          });
  52:   
  53:      }
  54:   
  55:  }

第 23 行的 R.layout.activity_main 內容如下,裡面只有 1 個按鈕,和 1 個 TextView

   1:  <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   2:      xmlns:tools="http://schemas.android.com/tools"
   3:      android:layout_width="match_parent"
   4:      android:layout_height="match_parent" >
   5:   
   6:      <TextView
   7:          android:id="@+id/text1"
   8:          android:layout_width="wrap_content"
   9:          android:layout_height="wrap_content"
  10:          android:layout_centerHorizontal="true"
  11:          android:layout_centerVertical="true"
  12:          android:text="@string/hello_world"
  13:          tools:context=".MainActivity" />
  14:   
  15:      <Button
  16:          android:id="@+id/buttonright"
  17:          android:layout_width="wrap_content"
  18:          android:layout_height="wrap_content"
  19:          android:layout_alignParentBottom="true"
  20:          android:layout_alignParentRight="true"
  21:          android:text="activity2" />
  22:   
  23:  </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 的內容

   1:  package com.example.androidtestproject;
   2:   
   3:  import android.app.Activity;
   4:  import android.content.Intent;
   5:  import android.os.Bundle;
   6:  import android.view.View;
   7:  import android.view.View.OnClickListener;
   8:  import android.widget.Button;
   9:  import android.widget.TextView;
  10:   
  11:  public class MainActivity2 extends Activity {
  12:   
  13:      Button bright;
  14:   
  15:      TextView tv1;
  16:   
  17:      int num;
  18:   
  19:      @Override
  20:      public void onCreate(Bundle savedInstanceState) {
  21:          super.onCreate(savedInstanceState);
  22:          setContentView(R.layout.activity_main2);
  23:   
  24:          Bundle b = this.getIntent().getExtras();
  25:          num = b.getInt("num");
  26:   
  27:          tv1 = (TextView) findViewById(R.id.text2);
  28:          tv1.setText("MainActivity2: " + num);
  29:   
  30:          bright = (Button) findViewById(R.id.buttonright);
  31:          bright.setOnClickListener(new OnClickListener() {
  32:   
  33:              @Override
  34:              public void onClick(View v) {
  35:                  // TODO Auto-generated method stub
  36:   
  37:                  Bundle b = new Bundle();
  38:                  num++;
  39:                  b.putInt("num", num);
  40:   
  41:                  Intent inte = new Intent();
  42:                  inte.setClass(MainActivity2.this, MainActivity.class);
  43:                  inte.putExtras(b);
  44:   
  45:                  startActivity(inte);
                       MainActivity2.this.finish();
  46:              }
  47:          });
  48:   
  49:      }
  50:  }

內容和第 1 個 MainActivity 相當類似,只差沒有檢查 b 是否為 null , 因為這個 Activity 預設並不會先啟動,一定會有 Activity 傳資料給它

結果為
一開始的 Activity 畫面,數值為 0


















點選右下方的 button 之後,數值增加




0 意見:

張貼留言

Twitter Delicious Facebook Digg Stumbleupon Favorites More

 
Design by Free WordPress Themes | Bloggerized by Lasantha - Premium Blogger Themes | Affiliate Network Reviews