如何获取变量';从Kotlin中的函数外部获取lambda表达式中的s值
我试图获取变量“finalvalue”的值,以便在另一个函数中使用它,但它在“edittext.onClickListener()”函数外部不可见/不可访问 我试图将它声明为一个伴星对象,但还是做不到。 另外,在main类中声明它会使它可见,但我需要在“edittext.onClickListener()”函数中设置的这个变量的更新值 我错过了什么?谢谢 更新:关于这个计划的一些话。这只是一个简单的倒计时计时器。getText()接受输入(多少秒),然后将其转换为整数。在下一个名为“startbutton.onClickListener”的函数中,我将其乘以1000,将其转换为秒,然后开始倒计时。 问题是我无法获得“finalvalue”的更新值。我只能访问变量的初始值如何获取变量';从Kotlin中的函数外部获取lambda表达式中的s值,lambda,kotlin,scope,Lambda,Kotlin,Scope,我试图获取变量“finalvalue”的值,以便在另一个函数中使用它,但它在“edittext.onClickListener()”函数外部不可见/不可访问 我试图将它声明为一个伴星对象,但还是做不到。 另外,在main类中声明它会使它可见,但我需要在“edittext.onClickListener()”函数中设置的这个变量的更新值 我错过了什么?谢谢 更新:关于这个计划的一些话。这只是一个简单的倒计时计时器。getText()接受输入(多少秒),然后将其转换为整数。在下一个名为“startb
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)
// ...
}
// ...
}
}
如果我能给出一些其他建议:
通常,在凌乱的代码中找到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
}