Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Android

วิธีส่งข้อมูลกลับไปยัง Main Activity ใน Android ด้วย Kotlin

ภาพรวม

ตัวอย่างนี้สาธิตวิธีส่งข้อมูลจาก Activity ที่สอง (SecondActivity) กลับไปยัง MainActivity โดยใช้ startActivityForResult และ onActivityResult แม้ว่าจะถูก Deprecated ใน API 30+ แต่ยังใช้งานได้ และเข้าใจง่ายสำหรับผู้เริ่มต้น

ขั้นตอนที่ 1: สร้างโปรเจกต์ใหม่

เปิด Android Studio เลือก File → New Project

ขั้นตอนที่ 2: Layout ของ MainActivity (activity_main.xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_horizontal"
    android:orientation="vertical"
    android:padding="16dp"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="100dp"
        android:layout_marginBottom="50dp"
        android:text="Tutorials Point"
        android:textAlignment="center"
        android:textColor="@android:color/holo_green_dark"
        android:textSize="32sp"
        android:textStyle="bold" />

    <TextView
        android:id="@+id/textViewResult"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Result: "
        android:textColor="@android:color/black"
        android:textSize="24sp"
        android:textStyle="bold" />

    <EditText
        android:id="@+id/editTextNumber1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:hint="Enter first number"
        android:inputType="number" />

    <EditText
        android:id="@+id/editTextNumber2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:hint="Enter second number"
        android:inputType="number" />

    <Button
        android:id="@+id/btnOpenActivity2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:text="Open Second Activity" />

</LinearLayout>

ขั้นตอนที่ 3: MainActivity.kt

import android.app.Activity
import android.content.Intent
import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import android.widget.TextView
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity

class MainActivity : AppCompatActivity() {
    private lateinit var textViewResult: TextView
    private lateinit var editTextNumber1: EditText
    private lateinit var editTextNumber2: EditText
    private lateinit var button: Button

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        title = "KotlinApp"

        textViewResult = findViewById(R.id.textViewResult)
        editTextNumber1 = findViewById(R.id.editTextNumber1)
        editTextNumber2 = findViewById(R.id.editTextNumber2)
        button = findViewById(R.id.btnOpenActivity2)

        button.setOnClickListener {
            val num1Str = editTextNumber1.text.toString()
            val num2Str = editTextNumber2.text.toString()

            if (num1Str.isEmpty() || num2Str.isEmpty()) {
                Toast.makeText(this@MainActivity, "Please insert numbers", Toast.LENGTH_SHORT).show()
            } else {
                val number1 = num1Str.toInt()
                val number2 = num2Str.toInt()
                val intent = Intent(this@MainActivity, SecondActivity::class.java)
                intent.putExtra("number1", number1)
                intent.putExtra("number2", number2)
                startActivityForResult(intent, 1)
            }
        }
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (requestCode == 1) {
            when (resultCode) {
                Activity.RESULT_OK -> {
                    val result = data?.getIntExtra("result", 0) ?: 0
                    textViewResult.text = "Result: $result"
                }
                Activity.RESULT_CANCELED -> {
                    textViewResult.text = "Nothing selected"
                }
            }
        }
    }
}

ขั้นตอนที่ 4: สร้าง SecondActivity

Layout (activity_second.xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_horizontal"
    android:orientation="vertical"
    android:padding="16dp"
    tools:context=".SecondActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="100dp"
        android:layout_marginBottom="50dp"
        android:text="Second Activity"
        android:textAlignment="center"
        android:textColor="@android:color/holo_blue_dark"
        android:textSize="32sp"
        android:textStyle="bold" />

    <TextView
        android:id="@+id/textViewNumbers"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Numbers: "
        android:textColor="@android:color/black"
        android:textSize="24sp"
        android:textStyle="bold" />

    <Button
        android:id="@+id/buttonAdd"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:text="Add" />

    <Button
        android:id="@+id/buttonSubtract"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:text="Subtract" />

</LinearLayout>

SecondActivity.kt

import android.app.Activity
import android.content.Intent
import android.os.Bundle
import android.widget.Button
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity

class SecondActivity : AppCompatActivity() {
    private lateinit var textViewNumber: TextView
    private lateinit var buttonAdd: Button
    private lateinit var buttonSubtract: Button
    private var number1 = 0
    private var number2 = 0

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_second)

        val intent = intent
        number1 = intent.getIntExtra("number1", 0)
        number2 = intent.getIntExtra("number2", 0)

        textViewNumber = findViewById(R.id.textViewNumbers)
        textViewNumber.text = "Numbers: $number1, $number2"

        buttonAdd = findViewById(R.id.buttonAdd)
        buttonSubtract = findViewById(R.id.buttonSubtract)

        buttonAdd.setOnClickListener {
            val result = number1 + number2
            val resultIntent = Intent().putExtra("result", result)
            setResult(Activity.RESULT_OK, resultIntent)
            finish()
        }

        buttonSubtract.setOnClickListener {
            val result = number1 - number2
            val resultIntent = Intent().putExtra("result", result)
            setResult(Activity.RESULT_OK, resultIntent)
            finish()
        }
    }
}

ขั้นตอนที่ 5: Manifest

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
    package="com.example.senddataback">
    <application ... >
        <activity android:name=".MainActivity"> ... </activity>
        <activity android:name=".SecondActivity" />
    </application>
</manifest>

วิธีการทำงานสมัยใหม่ (Activity Result API)

สำหรับ Android API 30+ ควรใช้ ActivityResultContracts แทน:

// ใน MainActivity
private val startSecondActivity = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
    if (result.resultCode == Activity.RESULT_OK) {
        val data = result.data
        val returnedResult = data?.getIntExtra("result", 0) ?: 0
        textViewResult.text = "Result: $returnedResult"
    }
}

// เรียกใช้
startSecondActivity.launch(Intent(this, SecondActivity::class.java))

การทดสอบ

รันแอป กรอกตัวเลข 2 จำนวน กดปุ่มเปิด Second Activity เลือกการคำนวณ (บวก/ลบ) ผลลัพธ์จะแสดงกลับใน MainActivity