接下來要來說明一下在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,其所對應的View是Calculator.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值就好了,只是這樣稍嫌麻煩就是了。
沒有留言:
張貼留言