iT邦幫忙

2025 iThome 鐵人賽

DAY 13
0

Intent除了跳轉頁面外也可以傳送資料給另一頁,如果希望傳遞資料,可以嘗試下列程式碼。

// 傳資料
Intent intent = new Intent(MainActivity.this, MainActivity2.class);
intent.putExtra("username", "feng");//傳送key:username,value:feng給MainActivity2
startActivity(intent);

// 接收資料(在 MainActivity2)
String name = getIntent().getStringExtra("username");

接下來就是實際上手嘗試,MainActivity這一頁的前半部分都跟原本一樣,只是我們為了傳送資料跟接收回傳回來的資料,需要多加幾行程式碼。

.putExtra("Extra Data", "Hello!")是用來將資料傳遞給下一頁,Extra Data是資料的名稱,"Hello!"則是實際傳遞的資料,如果希望會回傳結果就需要透過startActivityForResult(intent, 1)

intent.putExtra("Extra Data", "Hello!"); // 傳輸資料
//啟動MainActivity2,並且希望從該 Activity 回傳結果。
startActivityForResult(intent, 1);

第二頁MainActivity2則須先透過getIntent()取得傳遞過來的Intent,再利用getStringExtra("Extra Data")從中取出名為 "Extra Data" 的字串資料,成功接收到資料後textview的文字就會更改成Extra Data中的字串"Hello!"

Intent intent = getIntent();
String data = intent.getStringExtra("Extra Data");
textView.setText(data);//顯示

那從第二頁回傳過來也是差不多的道理,設定回傳資料的key跟value

 // 放入要回傳的字串資料,key 是 "Result"
resultIntent.putExtra("Result", "Hello! I am back!");
setResult(RESULT_OK, resultIntent);// 設定此 Activity 的結果為 RESULT_OK 且帶上回傳 Intent
finish(); // 關閉MainActivity2,回到MainActivity

第一頁確認是否正確回傳並接收資料

// 檢查是否requestCode = 1 且有成功回傳
if (requestCode == 1 && resultCode == RESULT_OK && data != null) {
    // 取得從 MainActivity2 回傳過來的資料Result並顯示在textView
    String result = data.getStringExtra("Result");
    textView.setText(result);
}

範例程式碼:

MainActivity:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    EdgeToEdge.enable(this);
    setContentView(R.layout.activity_main);

    button=findViewById(R.id.button);//綁定元件
    textView = findViewById(R.id.textView);

    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // 建立一個 Intent,從 MainActivity 跳轉到 MainActivity2
            Intent intent = new Intent(MainActivity.this, MainActivity2.class);
            intent.putExtra("Extra Data", "Hello!"); // 傳輸資料
            startActivityForResult(intent, 1);//啟動MainActivity2,並且希望從該 Activity 回傳結果。
        }
    });
}

@Override //接收資料,若成功接收則在TextView上顯示Hello! I am back!
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    // 檢查是否requestCode = 1 且有成功回傳
    if (requestCode == 1 && resultCode == RESULT_OK && data != null) {
        // 取得從 MainActivity2 回傳過來的資料Result並顯示在textView
        String result = data.getStringExtra("Result");
        textView.setText(result);
    }
}

MainActivity2:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    EdgeToEdge.enable(this);
    setContentView(R.layout.activity_main2);

    button=findViewById(R.id.button);//綁定元件
    textView = findViewById(R.id.textView);

    // 取得MainActivity 傳來的 Intent
    Intent intent = getIntent();
    // 從 Intent 取出名為 "Extra Data" 的字串資料
    String data = intent.getStringExtra("Extra Data");
    textView.setText(data);//顯示

    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent resultIntent = new Intent();// 建立一個新的 Intent 用來回傳資料
            // 放入要回傳的字串資料,key 是 "Result"
            resultIntent.putExtra("Result", "Hello! I am back!");
            setResult(RESULT_OK, resultIntent);// 設定此 Activity 的結果為 RESULT_OK 且帶上回傳 Intent
            finish(); // 關閉MainActivity2,回到MainActivity
        }
    });
}

activity_main && activity_main2

排版的程式碼我就偷懶跟上一份用一樣的了,有需要可以去看上一篇


執行成果展示:

一開始第一頁顯示的是"這裡是第一頁",點擊跳轉到第二頁,第二頁會接收第一頁傳送過來的字串"Hello!"並顯示,點擊按鈕再次跳轉回到第一頁,由於第二頁傳送了字串"Hello! I am back!",因此第一頁接收到資料後就會改變顯示的字了~

image alt


上一篇
Day 12.Intent
下一篇
Day 14.Recyclerview
系列文
Android 新手的 30 天進化論:從初學者到小專案開發者15
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言