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
相关产品推荐
相关产品推荐

