You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Kotlin:如何将DetailActivity的EditText值传回MainActivity

问题解决:DetailActivity数据回传至MainActivity

核心问题分析

  1. 仅回传了评分(rating)字段,未处理EditText中的名称、地址、日期修改内容
  2. RatingBar监听中过早调用setResult,且存在冗余代码导致评分恢复逻辑失效
  3. 未统一收集所有修改后的数据进行回传,而是分散处理

解决方案

直接将修改后的完整Location对象回传,而非单独传递字段,这样能一次性同步所有修改内容,同时修复RatingBar清空问题。

步骤1:修改DetailActivity,收集所有修改并统一回传

package com.example.core_2_kallenvp

import android.app.Activity
import android.content.Intent
import android.os.Bundle
import android.widget.EditText
import android.widget.ImageView
import android.widget.RatingBar
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity

class DetailActivity : AppCompatActivity() {
    // 保存当前编辑的Location实例
    private var currentLocation: Location? = null

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

        currentLocation = intent.getParcelableExtra("location")

        currentLocation?.let { location ->
            // 设置图片
            val imageView = findViewById<ImageView>(R.id.location_image)
            imageView.setImageResource(location.imageResource)

            // 名称EditText
            val nameEditText = findViewById<EditText>(R.id.location_name)
            nameEditText.setText(location.name)
            // 监听文本变化,实时更新Location的name字段
            nameEditText.addTextChangedListener { editable ->
                editable?.let {
                    location.name = it.toString()
                }
            }

            // 地址EditText
            val addressEditText = findViewById<EditText>(R.id.location_address)
            addressEditText.setText(location.address)
            addressEditText.addTextChangedListener { editable ->
                editable?.let {
                    location.address = it.toString()
                }
            }

            // 日期EditText
            val dateEditText = findViewById<EditText>(R.id.location_date)
            dateEditText.setText(location.visited)
            dateEditText.addTextChangedListener { editable ->
                editable?.let {
                    location.visited = it.toString()
                }
            }

            // 评分Bar
            val ratingBar = findViewById<RatingBar>(R.id.rating_bar)
            // 正确恢复评分:优先取savedInstanceState,否则用原始值
            val savedRating = savedInstanceState?.getFloat("rating") ?: location.rating
            ratingBar.rating = savedRating
            location.rating = savedRating

            // 监听评分变化,更新Location的rating字段
            ratingBar.setOnRatingBarChangeListener { _, rating, fromUser ->
                if (fromUser) {
                    Toast.makeText(this, "你给出的评分:$rating", Toast.LENGTH_SHORT).show()
                    location.rating = rating
                }
            }
        }
    }

    // 重写返回逻辑,在用户返回时回传修改后的Location
    override fun onBackPressed() {
        currentLocation?.let {
            val returnIntent = Intent()
            // 将修改后的完整Location对象传回
            returnIntent.putExtra("updated_location", it)
            setResult(Activity.RESULT_OK, returnIntent)
        }
        super.onBackPressed()
    }

    // 保存当前评分,避免屏幕旋转等情况丢失数据
    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        currentLocation?.rating?.let {
            outState.putFloat("rating", it)
        }
    }
}

步骤2:修改MainActivity,接收回传的Location并更新UI

package com.example.core_2_kallenvp

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

class MainActivity : AppCompatActivity() {

    var location1 = Location(
        "Go mall Phu Thanh",
        "212 Thoai Ngoc Thau street, Phu Thanh ward, Tan Phu district, HCM city",
        "Day visited: 12/4/2021",
        5f,
        R.drawable.gomall
    )
    var location2 = Location(
        "Aeon mall Tan Phu",
        "30 Bo Bao Tan Thang street, Son Ky ward, Tan Phu district, HCM city",
        "Day visited: 12/4/2020",
        5f,
        R.drawable.aeon
    )
    var location3 = Location(
        "UMP University", "217 Hong Bang street, 11th ward, 5th district, HCM city",
        "Day visited: 12/4/2022",
        3f,
        R.drawable.daihocyduoc
    )
    var location4 = Location(
        "Tran Phu High School",
        "18 Le Thuc Hoach street, Phu Tho Hoa ward, Tan Phu district, HCM city",
        "Day visited: 12/4/2023",
        2.5f,
        R.drawable.tranphu
    )

    companion object{
        const val location1data = 1
        const val location2data = 2
        const val location3data = 3
        const val location4data = 4
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        updateUI()
        setupClickListeners()
    }

    // 统一更新UI的方法,避免重复代码
    private fun updateUI() {
        // 更新名称TextView
        findViewById<TextView>(R.id.Go).text = location1.name
        findViewById<TextView>(R.id.Aeon).text = location2.name
        findViewById<TextView>(R.id.uni).text = location3.name
        findViewById<TextView>(R.id.school).text = location4.name

        // 更新RatingBar
        findViewById<RatingBar>(R.id.ratingBar1).rating = location1.rating
        findViewById<RatingBar>(R.id.ratingBar2).rating = location2.rating
        findViewById<RatingBar>(R.id.ratingBar3).rating = location3.rating
        findViewById<RatingBar>(R.id.ratingBar4).rating = location4.rating
    }

    // 统一设置点击监听
    private fun setupClickListeners() {
        findViewById<ImageView>(R.id.go).setOnClickListener {
            startDetailActivity(location1, location1data)
        }
        findViewById<ImageView>(R.id.aeon).setOnClickListener {
            startDetailActivity(location2, location2data)
        }
        findViewById<ImageView>(R.id.Uni).setOnClickListener {
            startDetailActivity(location3, location3data)
        }
        findViewById<ImageView>(R.id.tranphu).setOnClickListener {
            startDetailActivity(location4, location4data)
        }
    }

    // 封装启动DetailActivity的逻辑
    private fun startDetailActivity(location: Location, requestCode: Int) {
        val intent = Intent(this, DetailActivity::class.java)
        intent.putExtra("location", location)
        startActivityForResult(intent, requestCode)
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (resultCode == Activity.RESULT_OK) {
            val updatedLocation = data?.getParcelableExtra<Location>("updated_location") ?: return
            // 根据请求码更新对应的Location对象
            when(requestCode) {
                location1data -> location1 = updatedLocation
                location2data -> location2 = updatedLocation
                location3data -> location3 = updatedLocation
                location4data -> location4 = updatedLocation
            }
            // 更新UI
            updateUI()
        }
    }
}

步骤3:Location类保持不变

package com.example.core_2_kallenvp

import android.os.Parcelable
import kotlinx.parcelize.Parcelize

@Parcelize
data class Location(
    var name: String,
    var address: String,
    var visited: String,
    var rating: Float,
    val imageResource: Int
) : Parcelable

关键改进点

  • 统一回传完整Location对象,一次性同步所有修改的字段(名称、地址、日期、评分)
  • 实时监听EditText变化,更新Location实例的对应字段
  • 在用户返回时统一设置返回结果,避免过早调用setResult导致的数据不一致
  • 优化MainActivity代码结构,提取重复逻辑为单独方法,提升可读性
  • 修复RatingBar的状态恢复逻辑,避免清空问题

内容的提问来源于stack exchange,提问作者Kallen Houston

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 22:49:56