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

Android Kotlin:如何访问函数内变量并赋值给类成员变量

解决Android Kotlin中成员变量赋值与异步对话框逻辑问题

错误原因分析

你遇到的问题本质是两个核心错误:

  1. 类型不匹配:noOfPlayers()是无返回值(返回Unit)的函数,你试图把它赋值给Int类型的成员变量,编译器直接报错。
  2. 异步逻辑顺序错误:对话框是异步交互组件,noOfPlayers()调用后会立即返回,用户点击OK按钮才会给numberofTotalPlayers赋值。原来onCreate里的循环会在变量未被正确赋值时执行,完全达不到预期效果。

解决方案步骤

  1. 修正成员变量声明:给numberofTotalPlayers一个合法的初始值,确保初始化阶段符合Kotlin语法要求:

    private var numberofTotalPlayers: Int = 0
    
  2. 调整逻辑执行顺序:把调用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
        }
    }
    
  3. 移除无效代码:删除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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 05:10:56