2012年2月1日 星期三

【Android】Activity 間的資料傳遞


接下來要來說明一下在Activity之間切換時,該如何傳遞資料?

主要是需要透過Bundle物件來達成,先來看以上範例中如何在FirstActivity傳到SecondActivity

以下來看一下傳過去的程式實做:

傳送:
Bundle bundle = new Bundle();
bundle.putInt("id", id);
bundle.putString("name", account);
intent.putExtras(bundle);
startActivity(intent);


接收:
Bundle bundle = getIntent().getExtras();
bundle.getInt("id");
bundle.getString("name");



其實Intent也內建了Bundle物件,因此你也可以如下這樣寫

傳送:
Intent.putExtra(“id”, id);
Intent.putExtra(“name”, account)
startActivity(intent);

接收:
Intent intent = getIntent();
Intent.getIntExtra(“id”);
Intent.getStringExtra(“name”);



以下寫了一個範例,一開始輸入你的出生年份,按下送出的按鈕後,

系統會將你輸入的年份送到下一個Activity計算後呈現出你的年齡,

而這個Activity所對應的View也會有一個上一頁的按鈕,

按下去之後會回到一開始輸入年齡的那個Activity所對應的View

並且輸入的欄位上還會有你剛剛輸入的年份。



MainActivity.java 為第一個Activity,其對應的View(main.xml)為使用者輸入年份的畫面。

package org.sample.android;
//省略 import…..
public class MainActivity extends Activity {
   
     //代表下一個Activity的代碼,開發者可自行定義,
     private final static int CALCULATORACTIVITY_CODE = 0; 
     private Button button1;
     private EditText editText;
     /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        button1 = (Button)findViewById(R.id.button1);
        button1.setOnClickListener(new Button1OnClickListener());
        editText = (EditText)findViewById(R.id.editText1);
    }
   
     @Override
     //覆寫這個方法,可以讓Activity載呼叫 startActivityForResult()之後等待接收結果之後的動作
     protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
         // TODO Auto-generated method stub
         //以下的 if判斷回來的Activity是不是 CALCULATORACTIVITY_CODE
         if(requestCode == CALCULATORACTIVITY_CODE){
              switch(resultCode)
              {
                  case RESULT_OK:
                       //呈現剛剛使用者輸入的年份
     editText.setText(intent.getExtras().get("year").toString());
                       break;
                  default:
                       break;
              }
         }
         super.onActivityResult(requestCode, resultCode, intent);
     }
     //當按鈕按下後,將資料帶到下一個Activity
     private class Button1OnClickListener implements OnClickListener{
         @Override
         public void onClick(View v) {
              // TODO Auto-generated method stub
              //取得使用者輸入的年份
              CharSequence userInput = ((EditText)findViewById(R.id.editText1)).getText();
              //建立Intent物件
              Intent intent = new Intent(MainActivity.this, CalculatorActivity.class);
              Bundle bundle = new Bundle();
              bundle.putInt("year", Integer.valueOf(userInput.toString()));
              intent.putExtras(bundle);//附帶資料
              //切換到CalculatorActivity,並等待回應,且設定 requestCode   CALCULATORACTIVITY_CODE
              startActivityForResult(intent, CALCULATORACTIVITY_CODE);
         }
    }
   
   
}

CalculatorActivity.java 為第二個Activity,其所對應的ViewCalculator.xml, 負責計算年齡並呈現結果,以及提供一個上一頁的按鈕,讓使用者回到上一頁(返回前一個Activity)


package org.sample.android;
//省略import
public class CalculatorActivity extends Activity
{
     private Button button2;
     private Intent intent;
    
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         // TODO Auto-generated method stub
         super.onCreate(savedInstanceState);
         setContentView(R.layout.calculator);
         TextView textView = (TextView)findViewById(R.id.text_view_id1);
         intent = getIntent(); //取得Intent物件
         Bundle bundle = intent.getExtras();
         int year = bundle.getInt("year");
         int age = new Date().getYear() + 1900 - year;  //計算年齡
         textView.setText("您的年齡 : " + age);  //呈現結果     
         button2 = (Button)findViewById(R.id.button2);
         button2.setOnClickListener(new Button2OnClickListener());
        
     }
    
     //按下按鈕後回到上一個Activity
     private class Button2OnClickListener implements OnClickListener{
         @Override
         public void onClick(View v) {
              // TODO Auto-generated method stub
              //注意setResult這邊,程式再把intent物件塞回去
              //當然 你也可以額外再附帶其它要傳回去的資料
              setResult(RESULT_OK, intent);
              finish();
         }
     }
    
}

至於main.xml我就省略了,裡面主要就是有一個EditText以及Button

calculator.xml 主要也只有一個TextView以呈現結果,以及一個上一頁的按鈕。

這個範例其實很像我們一般網頁上的應用,

只是網頁技術可能是透過session或是內存達到的效果。

而上面這個範例你也可以不一定要用startActivityForResult()你也可以透過startActivity()來達成。

作法則是在第一個Activity送到下一個Activity之後要記得執行finish()

並且在onCreate()方法中取得Intent時判斷是不是null值就好了,只是這樣稍嫌麻煩就是了。


沒有留言:

張貼留言