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

Android Studio(Kotlin)如何在不同Activity间共享变量?

解决方案:Kotlin中跨Activity复用用户输入数据

为什么companion object方案不可行

companion object属于类的静态成员,它的生命周期和Activity实例完全分离:

  • 调用findViewById需要依赖Activity的上下文以及已加载完成的视图层级,而companion object在类加载时就初始化,此时Activity还未创建、视图也未加载,自然无法获取到正确的EditText实例。
  • 即使强行在companion object中保存数据,也会因为静态成员的特性,导致不同Activity实例的数据互相覆盖,引发逻辑错误。

方案1:Intent传递数据(适合一次性跳转传值)

这是跨Activity传值最基础的方式,适合只需要在跳转时传递一次数据的场景:

修改LogIn1stTimeActivity的点击事件:

package com.example.optilife

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

class LogIn1stTimeActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_log_in1st_time)
        
        val welcomeButton = findViewById<Button>(R.id.welcomeButton)
        val userHeight = findViewById<EditText>(R.id.et_UserHeight)
        val userWeight = findViewById<EditText>(R.id.et_UserWeight)
        val userAge = findViewById<EditText>(R.id.et_UserAge)

        welcomeButton.setOnClickListener { 
            // 先把输入转成数值(实际开发中建议添加非空/非数字校验)
            val height = userHeight.text.toString().toInt()
            val weight = userWeight.text.toString().toInt()
            val age = userAge.text.toString().toInt()
            
            // 创建Intent并添加数据
            val intent = Intent(this, WelcomeActivity::class.java).apply {
                putExtra("USER_HEIGHT", height)
                putExtra("USER_WEIGHT", weight)
                putExtra("USER_AGE", age)
            }
            startActivity(intent)
        }
    }
}

在WelcomeActivity中获取数据并计算:

class WelcomeActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_welcome)
        
        // 从Intent中取出数据,第二个参数为默认值
        val height = intent.getIntExtra("USER_HEIGHT", 0)
        val weight = intent.getIntExtra("USER_WEIGHT", 0)
        val age = intent.getIntExtra("USER_AGE", 0)
        
        // 计算推荐卡路里
        val recommendedCalories = 66 + 13.7 * weight + 5 * height - 6.8 * age
        // 后续可将结果显示到界面或做其他处理
    }
}

方案2:使用ViewModel(适合长期跨页面共享数据)

如果需要在多个页面长期复用用户数据,推荐使用Jetpack ViewModel,它能在配置变更(比如旋转屏幕)时保留数据,且支持跨Activity/Fragment共享:

1. 创建共享的ViewModel类:

import androidx.lifecycle.ViewModel

class UserProfileViewModel : ViewModel() {
    var userHeight: Int = 0
    var userWeight: Int = 0
    var userAge: Int = 0
}

2. 在LogIn1stTimeActivity中存储数据:

import androidx.lifecycle.ViewModelProvider

class LogIn1stTimeActivity : AppCompatActivity() {
    private lateinit var viewModel: UserProfileViewModel
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_log_in1st_time)
        
        // 获取ViewModel实例
        viewModel = ViewModelProvider(this)[UserProfileViewModel::class.java]
        
        val welcomeButton = findViewById<Button>(R.id.welcomeButton)
        val userHeight = findViewById<EditText>(R.id.et_UserHeight)
        val userWeight = findViewById<EditText>(R.id.et_UserWeight)
        val userAge = findViewById<EditText>(R.id.et_UserAge)

        welcomeButton.setOnClickListener { 
            viewModel.userHeight = userHeight.text.toString().toInt()
            viewModel.userWeight = userWeight.text.toString().toInt()
            viewModel.userAge = userAge.text.toString().toInt()
            
            val intent = Intent(this, WelcomeActivity::class.java)
            startActivity(intent)
        }
    }
}

3. 在WelcomeActivity中读取数据:

import androidx.lifecycle.ViewModelProvider

class WelcomeActivity : AppCompatActivity() {
    private lateinit var viewModel: UserProfileViewModel
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_welcome)
        
        // 获取Application级别的ViewModel实例,确保跨Activity共享
        viewModel = ViewModelProvider(ViewModelProvider.AndroidViewModelFactory.getInstance(application))[UserProfileViewModel::class.java]
        
        // 计算推荐卡路里
        val recommendedCalories = 66 + 13.7 * viewModel.userWeight + 5 * viewModel.userHeight - 6.8 * viewModel.userAge
        // 后续使用数据
    }
}

方案3:SharedPreferences(适合持久化存储用户数据)

如果需要将用户数据持久化保存(比如APP重启后还能读取),可以使用SharedPreferences:

在LogIn1stTimeActivity中存储数据:

class LogIn1stTimeActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_log_in1st_time)
        
        val welcomeButton = findViewById<Button>(R.id.welcomeButton)
        val userHeight = findViewById<EditText>(R.id.et_UserHeight)
        val userWeight = findViewById<EditText>(R.id.et_UserWeight)
        val userAge = findViewById<EditText>(R.id.et_UserAge)

        welcomeButton.setOnClickListener { 
            val height = userHeight.text.toString().toInt()
            val weight = userWeight.text.toString().toInt()
            val age = userAge.text.toString().toInt()
            
            // 获取SharedPreferences实例
            val sharedPref = getSharedPreferences("UserProfile", MODE_PRIVATE)
            with(sharedPref.edit()) {
                putInt("height", height)
                putInt("weight", weight)
                putInt("age", age)
                apply()
            }
            
            val intent = Intent(this, WelcomeActivity::class.java)
            startActivity(intent)
        }
    }
}

在WelcomeActivity中读取数据:

class WelcomeActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_welcome)
        
        val sharedPref = getSharedPreferences("UserProfile", MODE_PRIVATE)
        val height = sharedPref.getInt("height", 0)
        val weight = sharedPref.getInt("weight", 0)
        val age = sharedPref.getInt("age", 0)
        
        val recommendedCalories = 66 + 13.7 * weight + 5 * height - 6.8 * age
        // 后续使用数据
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 00:55:06