Android Kotlin:如何访问函数内变量并赋值给类成员变量
解决Android Kotlin中成员变量赋值与异步对话框逻辑问题
错误原因分析
你遇到的问题本质是两个核心错误:
- 类型不匹配:
noOfPlayers()是无返回值(返回Unit)的函数,你试图把它赋值给Int类型的成员变量,编译器直接报错。 - 异步逻辑顺序错误:对话框是异步交互组件,
noOfPlayers()调用后会立即返回,用户点击OK按钮才会给numberofTotalPlayers赋值。原来onCreate里的循环会在变量未被正确赋值时执行,完全达不到预期效果。
解决方案步骤
修正成员变量声明:给
numberofTotalPlayers一个合法的初始值,确保初始化阶段符合Kotlin语法要求:private var numberofTotalPlayers: Int = 0调整逻辑执行顺序:把调用
showCustomDialog()的循环移到对话框的OK点击回调中,确保只有用户确认输入后才执行后续逻辑,同时添加输入合法性校验避免崩溃:
在noOfPlayers()的PositiveButton回调中修改逻辑:.setPositiveButton("OK") { dialog, _ -> val inputText = numOfPlayers.text.toString() // 校验输入是否为有效数字 if (inputText.isNotBlank() && inputText.all { it.isDigit() }) { numberofTotalPlayers = inputText.toInt() // 变量赋值完成后,再执行循环弹出玩家名称对话框 for (i in 0 until numberofTotalPlayers) { showCustomDialog() } dialog.dismiss() } else { Toast.makeText(this, "请输入有效的数字", Toast.LENGTH_SHORT).show() // 不关闭对话框,让用户重新输入 return@setPositiveButton } }移除无效代码:删除
onCreate()中原来的循环代码,避免在变量未赋值时执行无效逻辑:// 移除这部分代码 // for (i in 0 until numberofTotalPlayers) { // showCustomDialog() // }
修改后的完整代码
package com.example.zccscores import android.app.AlertDialog import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.widget.Toast import com.example.zccscores.databinding.ActivityMainBinding import com.google.firebase.firestore.FirebaseFirestore import android.content.SharedPreferences import android.widget.EditText class MainActivity : AppCompatActivity() { private lateinit var playerName: String private lateinit var binding: ActivityMainBinding private lateinit var db: FirebaseFirestore private lateinit var sharedPreferences: SharedPreferences private var TotalScores: Long = 0 // 修改:给成员变量合法初始值 private var numberofTotalPlayers: Int = 0 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) db = FirebaseFirestore.getInstance() sharedPreferences = getSharedPreferences("MyPrefs", MODE_PRIVATE) noOfPlayers() // 移除:原来的循环逻辑已移到对话框回调中 binding.fourBTN.setOnClickListener { TotalScores += 4 } binding.sixBTN.setOnClickListener { TotalScores += 6 } binding.singleBTN.setOnClickListener { TotalScores += 1 } } private fun noOfPlayers() { val dialogView = layoutInflater.inflate(R.layout.dialog_with_edittext, null) val numOfPlayers = dialogView.findViewById<EditText>(R.id.dialogEditText) numOfPlayers.inputType = android.text.InputType.TYPE_CLASS_PHONE val builder = AlertDialog.Builder(this) .setView(dialogView) .setPositiveButton("OK") { dialog, _ -> val inputText = numOfPlayers.text.toString() // 修改:添加输入校验,确保赋值有效 if (inputText.isNotBlank() && inputText.all { it.isDigit() }) { numberofTotalPlayers = inputText.toInt() // 修改:在赋值后执行循环逻辑 for (i in 0 until numberofTotalPlayers) { showCustomDialog() } dialog.dismiss() } else { Toast.makeText(this, "请输入有效的数字", Toast.LENGTH_SHORT).show() return@setPositiveButton } } .setNegativeButton("Cancel") { dialog, _ -> Toast.makeText(this, "Cancel clicked", Toast.LENGTH_SHORT).show() dialog.dismiss() } val dialog = builder.create() dialog.show() } private fun showCustomDialog() { val dialogView = layoutInflater.inflate(R.layout.dialog_with_edittext, null) val dialogEditText = dialogView.findViewById<EditText>(R.id.dialogEditText) val builder = AlertDialog.Builder(this) .setView(dialogView) .setPositiveButton("OK") { dialog, _ -> val diologeFetchedPlayerName = dialogEditText.text.toString() if (diologeFetchedPlayerName.isNotBlank()) { val playerData = Scores(232, diologeFetchedPlayerName, 89) db.collection("ZCC Scores").document(diologeFetchedPlayerName).set(playerData) .addOnSuccessListener { binding.firstPlayerScores.text = playerData.toString() Toast.makeText( this, "Player data saved from diologue", Toast.LENGTH_SHORT ).show() }.addOnFailureListener { Toast.makeText(this, "ERROR", Toast.LENGTH_SHORT).show() } binding.firstPlayerTV.text = diologeFetchedPlayerName Toast.makeText(this, "Player name saved", Toast.LENGTH_SHORT).show() } else { Toast.makeText(this, "Please enter a valid player name", Toast.LENGTH_SHORT) .show() } dialog.dismiss() } .setNegativeButton("Cancel") { dialog, _ -> Toast.makeText(this, "Cancel clicked", Toast.LENGTH_SHORT).show() dialog.dismiss() } val dialog = builder.create() dialog.show() } }
内容的提问来源于stack exchange,提问作者Aurangzaib Buzdar
相关产品推荐
相关产品推荐

