Android Kotlin中Activity间传递变量时villain4Position异常问题
Bundle传递villain4Position失败的解决方案
在Android Kotlin开发中,我尝试通过Bundle向PositionActivityLeft自身传递多个变量,其余变量都能正常接收,但villain4Position始终只能获取到默认值"_"。已经确认传递前该变量的值是正确的,尝试过修改变量名、调整代码位置都没有效果;之前用MutableList存储反派位置时,第4个元素(索引3)也出现过同样的问题。
打包代码:
var intentNext= Intent(this@PositionActivityLeft, PositionActivityLeft::class.java) val bundle = Bundle() bundle.putBoolean("confirmChoices", confirmChoices) bundle.putString("gameType", gameType) bundle.putInt("smallBlind", smallBlind) bundle.putInt("bigBlind", bigBlind) bundle.putInt("buyIn", buyIn) bundle.putInt("handsPerHour", handsPerHour) bundle.putString("venue", venue) bundle.putString("location", location) bundle.putString("venueType", venueType) bundle.putInt("numSession", numSession) bundle.putInt("numSessionHands", numSessionHands) bundle.putInt("stackSize", stackSize) bundle.putInt("numVillains", numVillainsCount) bundle.putString("heroPosition", heroPosition) bundle.putString("villain1Position", villain1Position) bundle.putString("villain2Position", villain2Position) bundle.putString("villain3Position", villain3Position) bundle.putString("Villain4Position", villain4Position) bundle.putString("villain5Position", villain5Position) bundle.putString("villain6Position", villain6Position) bundle.putString("villain7Position", villain7Position) bundle.putString("villain8Position", villain8Position) intentNext.putExtras(bundle) startActivity(intentNext) overridePendingTransition(0,0)
读取代码:
class PositionActivityLeft : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_position_left) // other variable declarations val bundle: Bundle? = intent.extras val confirmChoices = bundle!!.getBoolean("confirmChoices") val gameType = bundle.getString("gameType") val smallBlind = bundle.getInt("smallBlind") val bigBlind = bundle.getInt("bigBlind") val buyIn = bundle.getInt("buyIn") val handsPerHour = bundle.getInt("handPerHour") val venue = bundle.getString("venue") val location = bundle.getString("location") val venueType = bundle.getString("venueType") val numSession = bundle.getInt("numSession") val numSessionHands = bundle.getInt("numSessionHands") val stackSize = bundle.getInt("stackSize") val numVillains = bundle.getInt("numVillains") var heroPosition = bundle.getString("heroPosition") var villain1Position = bundle.getString("villain1Position","_") var villain2Position = bundle.getString("villain2Position","_") var villain3Position = bundle.getString("villain3Position","_") var villain4Position = bundle.getString("villain4Position","_") var villain5Position = bundle.getString("villain5Position","_") var villain6Position = bundle.getString("villain6Position","_") var villain7Position = bundle.getString("villain7Position","_") var villain8Position = bundle.getString("villain8Position","_")
问题核心
你代码里的key大小写不匹配是直接原因:
- 打包时存入Bundle的key是
"Villain4Position"(首字母大写V) - 读取时使用的key是
"villain4Position"(首字母小写v)
Bundle的key严格区分大小写,因此读取时找不到对应值,只能返回默认的"_"。
修复方案
任选一种方式保持key一致即可:
- 修改打包代码的key为小写开头:
bundle.putString("villain4Position", villain4Position)
- 或修改读取代码的key为大写开头:
var villain4Position = bundle.getString("Villain4Position","_")
优化建议
为避免此类低级错误,推荐两种更规范的写法:
- 用常量统一定义所有Bundle的key:
companion object { const val KEY_VILLAIN_4_POSITION = "villain4Position" // 其他所有传递的key也用常量定义 }
打包和读取时都使用常量,彻底杜绝拼写/大小写错误。
- 封装成
Parcelable数据类传递:
将所有相关变量封装成一个实现Parcelable的数据类,一次性传递整个对象,代码更简洁易维护:
// 定义数据类 @Parcelize data class GameConfig( val confirmChoices: Boolean, val gameType: String?, // ... 其他所有变量 val villain4Position: String? ) : Parcelable // 传递时 val gameConfig = GameConfig(/* 填充所有变量值 */) val intentNext = Intent(this@PositionActivityLeft, PositionActivityLeft::class.java) intentNext.putExtra("gameConfig", gameConfig) startActivity(intentNext) // 读取时 val gameConfig = intent.getParcelableExtra<GameConfig>("gameConfig") val villain4Position = gameConfig?.villain4Position ?: "_"
内容的提问来源于stack exchange,提问作者Vic.Cruzr
相关产品推荐
相关产品推荐

