我正在尝试获取变量“ finalvalue”的值,以便在另一个函数中使用它,但是在“ edittext.onClickListener()”函数外部无法看到/访问该变量。
我试图将其声明为伴随对象,但仍然无法实现。 另外,在主类中声明它使其可见,但是我想要在“ edittext.onClickListener()”函数中设置的此变量的更新值。
我想念什么?谢谢。
更新:关于程序的一些话。这只是一个简单的倒数计时器。 edittext.getText()接受输入(几秒钟),然后将其转换为Integer。在下一个名为“ startbutton.onClickListener”的函数中,我将其乘以1000以将其转换为秒并开始倒计时。 问题是我无法获取“ finalvalue”的更新值。我只能访问该变量的初始值。
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
var finalvalue = 30
val day_night=findViewById<Button>(R.id.day_night)
val setbutton=findViewById<Button>(R.id.setbutton)
val stopbutton=findViewById<Button>(R.id.stopbutton)
val startbutton=findViewById<Button>(R.id.startbutton)
val antistrofimetrisi=findViewById<TextView>(R.id.antistrofimetrisi)
val edittext=findViewById<EditText>(R.id.edittext)
var edittextIsVisible = false
antistrofimetrisi.setText("0")
setbutton.setOnClickListener() {
if(edittextIsVisible == false) {
edittext.setVisibility(View.VISIBLE)
edittextIsVisible = true }
else {
edittext.setVisibility(View.GONE)
edittextIsVisible = false }
}
edittext.setOnEditorActionListener() { v, actionId, event ->
if (actionId == EditorInfo.IME_ACTION_DONE && edittext.getText().toString() == "")
{
Toast.makeText(this, "Εισάγετε έγκυρο αριθμό δευτερολέπτων", Toast.LENGTH_LONG).show()
true
}
else
{
var value: String = edittext.getText().toString()
var finalvalue = Integer.parseInt(value)
antistrofimetrisi.setText(finalvalue.toString())
Toast.makeText(
this,
"Πιέστε START για αντίστροφη μέτρηση από τα " + finalvalue + " δευτερόλεπτα",
Toast.LENGTH_SHORT
).show()
false
}
}
startbutton.setOnClickListener()
{
var secondsLeft: Int = 0
var finalseconds = finalvalue*1000
val timer = object: CountDownTimer(finalseconds.toLong(), 100) {
override fun onTick(millisUntilFinished: Long) {
if (Math.round(millisUntilFinished.toFloat() / 1000.0f) != secondsLeft)
{
secondsLeft = Math.round(millisUntilFinished.toFloat() / 1000.0f)
antistrofimetrisi.setText(secondsLeft.toString())
}
var timeleft = millisUntilFinished / 1000
antistrofimetrisi.setText(timeleft.toString()) }
override fun onFinish() {
antistrofimetrisi.setText("0")
start()
}
}.start()
stopbutton.setOnClickListener()
{
timer.cancel()
antistrofimetrisi.setText("0")
}
}
答案 0 :(得分:1)
您的主要问题是您正在屏蔽变量。您已两次声明var finalValue
-在onCreate
顶部附近和回调中。在回调内部,您将更新仅在该作用域中存在的临时变量。外部变量永远不会更新。
您在类级别没有变量。最外部的版本仅在onCreate
的范围内定义。
class MainActivity : AppCompatActivity() {
// this is not a good variable name, since the variable is not final
// in the programming sense or in any other sense of the word
var finalValue = 30
override fun onCreate(savedInstanceState: Bundle?) {
// ...
edittext.setOnEditorActionListener { v, actionId, event ->
// ...
var value: String = edittext.getText().toString()
// note that I'm not re-declaring with "var" here
finalvalue = Integer.parseInt(value)
// ...
}
// ...
}
}
如果我可以提出其他建议:
fun onCreate(savedInstanceState: Bundle?) {
editText.setOnEditorActionListener { v, actionId, event ->
onEditTextChanged(editText.getText())
}
}
fun onEditTextChanged(text : String) {
// all of the logic from the callback goes here
}
当您的代码不那么混乱时,更容易了解逻辑。
通常,在混乱的代码中发现错误就像在混乱的房间中发现某些东西一样。如果您想找到东西,请开始接听。然后,您一次要完成两件事。当您打扫卫生时,您会找到想要的东西-而且您将拥有一个漂亮的洁净室!