如何从Kotlin中的函数外部获取Lambda表达式中的变量值

时间:2019-04-06 17:42:59

标签: lambda kotlin scope

我正在尝试获取变量“ 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")
        }
    }

1 个答案:

答案 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)

            // ...
        }

        // ...
    }
}

如果我可以提出其他建议:

  1. 正确设置代码格式。使用Android Studio的自动格式化功能。您这里拥有的东西看起来有点像C风格,但这是Kotlin,所以...
  2. 破坏代码。之所以遇到这个问题,是因为您只有一个功能强大的功能,可以完成所有工作。您的回调实际上应该只调用一个函数,该函数执行所有逻辑。像这样:
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
}

当您的代码不那么混乱时,更容易了解逻辑。

通常,在混乱的代码中发现错误就像在混乱的房间中发现某些东西一样。如果您想找到东西,请开始接听。然后,您一次要完成两件事。当您打扫卫生时,您会找到想要的东西-而且您将拥有一个漂亮的洁净室!