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

Android中SecondActivity修改数值后同步更新MainActivity的TextView

解决MainActivity与SecondActivity计数同步问题

当前问题:在SecondActivity中点击对话框YES按钮后,textSecondCount成功执行减法并更新,但MainActivity的textCount未同步更新,尽管已尝试通过广播传递数值。

问题根源

MainActivity未注册对应的广播接收器,无法接收SecondActivity发送的更新广播;同时缺少对广播消息的处理逻辑,无法将接收到的数值更新到UI。

解决方案

在MainActivity中添加广播接收器的注册与实现,确保能接收并处理SecondActivity发送的计数更新。

修改后的MainActivity代码

import android.annotation.SuppressLint
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.content.SharedPreferences
import android.os.Bundle
import android.widget.Button
import android.widget.TextView
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView

class MainActivity : AppCompatActivity() {

    private lateinit var textCount: TextView
    // 定义广播接收器
    private val updateReceiver = object : BroadcastReceiver() {
        override fun onReceive(context: Context?, intent: Intent?) {
            val newCount = intent?.getIntExtra("textCount", 0) ?: 0
            // 调用已有方法更新UI和本地存储
            updateTextCount(newCount)
        }
    }

    @SuppressLint("MissingInflatedId")
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        setContentView(R.layout.activity_main)

        val recyclerView = findViewById<RecyclerView>(R.id.recyclerview)
        textCount = findViewById<TextView>(R.id.textCount)
        val btnGo = findViewById<Button>(R.id.btnGo)

        val cards = listOf("Item1")

        // 加载保存的计数
        loadTextCount()

        val adapter = PractiseAdapter(cards, textCount)
        recyclerView.layoutManager = LinearLayoutManager(this)
        recyclerView.adapter = adapter

        btnGo.setOnClickListener {
            val intent = Intent(this@MainActivity, Second::class.java)
            startActivity(intent)
        }

        // 注册广播接收器
        registerReceiver(updateReceiver, IntentFilter("com.example.UPDATE_TEXT_COUNT"), RECEIVER_NOT_EXPORTED)
    }

    override fun onDestroy() {
        super.onDestroy()
        // 注销广播接收器,避免内存泄漏
        unregisterReceiver(updateReceiver)
    }

    private fun saveTextCount(count: Int) {
        val sharedPreferences: SharedPreferences = getSharedPreferences("MyPrefs", MODE_PRIVATE)
        val editor = sharedPreferences.edit()
        editor.putInt("textCount", count)
        editor.apply() // or editor.commit()
    }

    private fun loadTextCount() {
        val sharedPreferences: SharedPreferences = getSharedPreferences("MyPrefs", MODE_PRIVATE)
        val savedCount = sharedPreferences.getInt("textCount", 0)
        textCount.text = savedCount.toString()
    }

    private fun sendUpdateBroadcast(count: Int) {
        val intent = Intent("com.example.UPDATE_TEXT_COUNT")
        intent.putExtra("textCount", count)
        sendBroadcast(intent)
    }

    fun updateTextCount(newValue: Int) {
        // 更新TextView
        textCount.text = newValue.toString()
        // 保存新数值
        saveTextCount(newValue)
        // 发送广播通知其他组件
        sendUpdateBroadcast(newValue)
    }
}

额外优化建议

  1. 统一广播Action常量:将"com.example.UPDATE_TEXT_COUNT"定义为全局常量,避免拼写错误,例如创建Constants类:
object Constants {
    const val ACTION_UPDATE_TEXT_COUNT = "com.example.UPDATE_TEXT_COUNT"
}

后续所有使用该Action的地方直接引用Constants.ACTION_UPDATE_TEXT_COUNT即可。

  1. 前台兜底更新:在MainActivity的onResume方法中重新加载SharedPreferences的数值,作为广播接收失败的兜底方案:
override fun onResume() {
    super.onResume()
    loadTextCount()
}

修改完成后,当SecondActivity发送广播时,MainActivity的广播接收器会立即接收并更新textCount;同时MainActivity回到前台时也会自动加载最新数值,确保计数完全同步。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 11:24:55