如何获取变量';从Kotlin中的函数外部获取lambda表达式中的s值

如何获取变量';从Kotlin中的函数外部获取lambda表达式中的s值,lambda,kotlin,scope,Lambda,Kotlin,Scope,我试图获取变量“finalvalue”的值,以便在另一个函数中使用它,但它在“edittext.onClickListener()”函数外部不可见/不可访问 我试图将它声明为一个伴星对象,但还是做不到。 另外,在main类中声明它会使它可见,但我需要在“edittext.onClickListener()”函数中设置的这个变量的更新值 我错过了什么?谢谢 更新:关于这个计划的一些话。这只是一个简单的倒计时计时器。getText()接受输入(多少秒),然后将其转换为整数。在下一个名为“startb

我试图获取变量“finalvalue”的值,以便在另一个函数中使用它,但它在“edittext.onClickListener()”函数外部不可见/不可访问

我试图将它声明为一个伴星对象,但还是做不到。 另外,在main类中声明它会使它可见,但我需要在“edittext.onClickListener()”函数中设置的这个变量的更新值

我错过了什么?谢谢

更新:关于这个计划的一些话。这只是一个简单的倒计时计时器。getText()接受输入(多少秒),然后将其转换为整数。在下一个名为“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")
        }
    }
class MainActivity:AppCompatActivity(){
重写创建时的乐趣(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
var最终价值=30
val day\u night=findViewById(R.id.day\u night)
val setbutton=findviewbyd(R.id.setbutton)
val stopbutton=findViewById(R.id.stopbutton)
val startbutton=findViewById(R.id.startbutton)
val antistrofimetrisi=findviewbyd(R.id.antistrofimetrisi)
val edittext=findviewbyd(R.id.edittext)
var edittextIsVisible=false
Antisticstrofisi.setText(“0”)
setbutton.setOnClickListener(){
如果(edittextIsVisible==false){
edittext.setVisibility(View.VISIBLE)
edittextIsVisible=true}
否则{
edittext.setVisibility(View.GONE)
edittextIsVisible=false}
}
edittext.setOnEditorActionListener(){v,actionId,事件->
if(actionId==EditorInfo.IME\u ACTION\u DONE&&edittext.getText().toString()==“”)
{
Toast.makeText(这是“Toast.LENGTH”show()
符合事实的
}
其他的
{
变量值:String=edittext.getText().toString()
var finalvalue=Integer.parseInt(值)
antistrofimetrisi.setText(finalvalue.toString())
Toast.makeText(
这
"∏ι∑τε开始γιαντ∑τροφημέτρησηαπτα+最终值+"Δε∑τεεερρτλεπτα",
吐司长度
).show()
错误的
}
}
startbutton.setOnClickListener()
{
var secondsLeft:Int=0
var finalseconds=最终价值*1000
val timer=object:CountDownTimer(finalseconds.toLong(),100){
覆盖趣味点击(毫秒直到完成:长){
if(数学圆整(毫秒直到完成.到浮点()/1000.0f)!=秒英尺)
{
secondsLeft=Math.round(毫秒直至完成.toFloat()/1000.0f)
antistrofimetrisi.setText(secondsLeft.toString())
}
var timeleft=millisUntilFinished/1000
antistrofimetrisi.setText(timeleft.toString())}
重写函数onFinish(){
Antisticstrofisi.setText(“0”)
开始()
}
}.start()
stopbutton.setOnClickListener()
{
timer.cancel()
Antisticstrofisi.setText(“0”)
}
}

您的主要问题是隐藏变量。您已经声明了
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)

            // ...
        }

        // ...
    }
}
如果我能给出一些其他建议:

  • 正确格式化你的代码。使用Android Studio的自动格式化功能。你这里的看起来有点像C风格,但这是Kotlin,所以
  • 分解你的代码。你在这方面遇到问题的原因是因为你只有一个巨大的函数,它可以完成所有事情。你的回调应该只调用一个函数,而这个函数就是执行所有逻辑的函数。类似这样:
  • 当代码不那么混乱时,就更容易看到逻辑是什么


    通常,在凌乱的代码中找到bug就像在凌乱的房间中找到东西一样。如果你想找到什么,就开始捡东西。然后你同时完成了两件事。当你清理时,你会找到你要找的东西——你会有一个很好的干净房间!

    为什么不在类级别而不是在类内部声明finalValue呢listener?是的,但是我得到了这个变量的声明值,而不是edittext.setOnEditorActionListener()中设置的更新值函数。在监听器内部更改后,您将获得新值。如果监听器内部的代码未执行,当然您将获得初始值。它仍然提供初始值。我认为您需要显示更多代码,包括在监听器外部定义finalvalue的位置以及如何确保访问finalvalue在调用侦听器之后。你是对的。它被隐藏了。谢谢你的回答,这是真的,我更喜欢C风格。我可能需要使我的代码更有条理。再次感谢。
    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
    }