在Android中使用Kotlin实现Activity间数据传递

使用 GPT-4o 回答,作者 GPT4oMini.app

问题:

在Android Studio Koala中用Kotlin进行开发。实现如下功能:在SecondActivity中,用户在textView中输入数据data,用户通过返回按钮或按下Back键回到FirstActivity的同时,要把SecondActivity的数据data传回给FirstActivity。 请采用当前主流的方法进行实现,不要使用已过时的函数。

答案:

在Android开发中,使用ActivityResultContractsActivityResultLauncher是当前主流的方法来处理Activity之间的数据传递。以下是如何在Android Studio Koala中使用Kotlin实现这个功能:

Step 1: 在FirstActivity中启动SecondActivity并接收结果

  1. 在FirstActivity中,定义一个ActivityResultLauncher来启动SecondActivity并接收结果。
import android.content.Intent
import android.os.Bundle
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AppCompatActivity
import android.widget.TextView

class FirstActivity : AppCompatActivity() {

    private lateinit var resultLauncher: ActivityResultLauncher<Intent>
    private lateinit var textView: TextView

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

        textView = findViewById(R.id.textView)

        // Initialize the ActivityResultLauncher
        resultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
            if (result.resultCode == RESULT_OK) {
                val data = result.data?.getStringExtra("data")
                textView.text = data
            }
        }

        // Start SecondActivity when needed
        findViewById<Button>(R.id.button).setOnClickListener {
            val intent = Intent(this, SecondActivity::class.java)
            resultLauncher.launch(intent)
        }
    }
}

Step 2: 在SecondActivity中返回数据

  1. 在SecondActivity中,设置返回数据的逻辑。
import android.app.Activity
import android.content.Intent
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import android.widget.Button
import android.widget.EditText

class SecondActivity : AppCompatActivity() {

    private lateinit var editText: EditText

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

        editText = findViewById(R.id.editText)

        // Set result and finish when the button is clicked
        findViewById<Button>(R.id.button).setOnClickListener {
            val data = editText.text.toString()
            val resultIntent = Intent().apply {
                putExtra("data", data)
            }
            setResult(Activity.RESULT_OK, resultIntent)
            finish()
        }
    }

    override fun onBackPressed() {
        val data = editText.text.toString()
        val resultIntent = Intent().apply {
            putExtra("data", data)
        }
        setResult(Activity.RESULT_OK, resultIntent)
        super.onBackPressed()
    }
}

Step 3: 定义布局文件

  1. res/layout/activity_first.xml中定义FirstActivity的布局。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="16dp">

    <TextView
        android:id="@+id/textView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="First Activity"
        android:textSize="18sp" />

    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Go to Second Activity" />
</LinearLayout>
  1. res/layout/activity_second.xml中定义SecondActivity的布局。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="16dp">

    <EditText
        android:id="@+id/editText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Enter data here" />

    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Return Data" />
</LinearLayout>

总结

通过使用ActivityResultContracts.StartActivityForResultActivityResultLauncher,我们可以轻松地在Activity之间传递数据,并且这种方法是当前主流且推荐的方式。这样可以确保代码的可维护性和兼容性。