Android Kotlin:如何将DetailActivity的EditText值传回MainActivity
问题解决:DetailActivity数据回传至MainActivity
核心问题分析
- 仅回传了评分(rating)字段,未处理EditText中的名称、地址、日期修改内容
- RatingBar监听中过早调用
setResult,且存在冗余代码导致评分恢复逻辑失效 - 未统一收集所有修改后的数据进行回传,而是分散处理
解决方案
直接将修改后的完整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
相关产品推荐
相关产品推荐

