我想访问函数外的变量numOfPlayers,并将其值分配给同一个类中的变量numberOfTotalPlayers,但我无法在那里访问它,我如何才能做到这一点?请忽略我的代码格式和额外的代码,我只是试图使其可行。
这几乎是完整的代码…
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.util.Log
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 = noOfPlayers
**
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
db = FirebaseFirestore.getInstance()
sharedPreferences = getSharedPreferences("MyPrefs", MODE_PRIVATE)
noOfPlayers()
for (i in 0 until numberofTotalPlayers) {
showCustomDialog()
}
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, _ ->
// Handle OK button click and retrieve the text from the EditText
numberofTotalPlayers = numOfPlayers.text.toString().toInt()
dialog.dismiss() // Dismiss the dialog after handling button click
}
.setNegativeButton("Cancel") { dialog, _ ->
// Handle Cancel button click if needed
Toast.makeText(this, "Cancel clicked", Toast.LENGTH_SHORT).show()
dialog.dismiss() // Dismiss the dialog after handling button click
}
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, _ ->
// Handle OK button click and retrieve the text from the EditText
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() // Dismiss the dialog after handling button click
}
.setNegativeButton("Cancel") { dialog, _ ->
// Handle Cancel button click if needed
Toast.makeText(this, "Cancel clicked", Toast.LENGTH_SHORT).show()
dialog.dismiss() // Dismiss the dialog after handling button click
}
val dialog = builder.create()
dialog.show()
}
}
字符串
中的函数外访问该变量
val numberOfTotalPlayers:Int = noOfPlayers //Getting error here
}```
型
2条答案
按热度按时间wgmfuz8q1#
你不能访问它--它的作用域是那个函数。它只在该函数执行时存在,并且每次执行该函数时都存在它的不同副本。因此,“进入”函数并提取变量值在逻辑上是没有意义的。每次调用该函数时,它都可能不同,或者该函数可能永远不会被调用。
此外,
numberofTotalPlayers: Int
属性在构造类时初始化,这是在调用onCreate()
之前。此时,您的EditText甚至还不存在。即使有,如果您在创建EditText之后立即初始化属性,则其中还没有文本。一个属性的初始化器只被调用一次,当类被构造的时候。
您需要重新考虑这个类的设计,并关注代码的执行顺序。现在,看起来您正在尝试立即提示用户输入多个玩家,然后尝试立即创建与玩家一样多的对话框。您不能这样做,因为用户输入的数字直到他们输入并关闭对话框之后才可用,这将在
onCreate()
完成之后很久才发生。另外,打开4个对话框立即在对方的顶部将是一个大混乱。我不知道你到底想做什么,但你可能需要使用 * 状态机设计模式 * 来实现这一点(你可以查一下)。mwngjboj2#
java/Kotlin中的变量根据它们声明的上下文进行评分。如果你在一个方法中声明了一个变量,你只能从这个方法中访问它。这样做的好处是,一个类中声明一个变量的两个方法可以使用相同的名称,但它仍然是两个不同的变量。
要从一个类内部的不同方法中获取一个变量,可以在类级别定义,然后使用
this.noOfPlayers
引用。它现在在该类的同一对象上操作的所有方法之间共享。如果你想在不同的对象之间共享它,你通常会为该变量声明getter和setter。**EDIT:**或者对于Kotlin,可见性修饰符(默认为public)