【问题标题】:I keep getting "modifier override is not applicable to local function' when trying to use onclicklistener尝试使用 onclicklistener 时,我不断收到“修饰符覆盖不适用于本地功能”
【发布时间】:2020-12-31 00:53:26
【问题描述】:

我正在尝试为一个小型测验应用程序编写代码。当您单击加号按钮时,它会将您带到一个单独的页面,您可以在其中输入问题和答案。当您单击复选按钮时,它将带您返回上一页,并创建一个新按钮,其中文本设置为问题。当我尝试在我的 buttonclick 事件下放置覆盖时,我遇到了一个错误。无论如何我可以解决这个问题吗?

Newbtn 页面:

    package com.example.test

import android.app.Activity
import android.content.Intent
import android.graphics.Color
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.Gravity
import android.view.Menu
import android.view.MenuItem
import android.view.View
import android.widget.Button
import android.widget.LinearLayout
import android.widget.TextView
import android.widget.Toast
import androidx.appcompat.app.AlertDialog
import com.google.android.material.floatingactionbutton.FloatingActionButton

class Newbtn : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_newbtn)

        val newbutton = Button(this@Newbtn)
        val btn = findViewById<FloatingActionButton>(R.id.btn2)
        val intent = getIntent()
        val test = intent.getStringExtra("test")

        newbutton.layoutParams = LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT)
        newbutton.width=1010
        newbutton.height=300
        newbutton.gravity = Gravity.CENTER
        newbutton.translationX= 65F
        newbutton.setTextColor(Color.parseColor("#FFFFFFFF"))
        newbutton.setBackgroundColor(Color.parseColor("#250A43"))
        newbutton.text = test


        btn.setOnClickListener{
            val activityCode = 2
            startActivityForResult(
                    Intent(this@Newbtn, QuestionPage::class.java), activityCode
            )

            override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
                super.onActivityResult(requestCode, resultCode, data)
                if (requestCode == activityCode && resultCode == Activity.RESULT_OK) {
                    val buttonText = data?.getStringExtra("test")
                    newbutton.text = buttonText
                }
        }
    }
}}

问题页面:

    package com.example.test

import android.app.Activity
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.EditText
import com.google.android.material.floatingactionbutton.FloatingActionButton

class QuestionPage : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_question_page)

        val btn3 = findViewById<FloatingActionButton>(R.id.btn3)
        val intent = Intent(this@QuestionPage, Newbtn::class.java)
        val question = findViewById<EditText>(R.id.question)
        val answer = findViewById<EditText>(R.id.answer)
        val questiontext = question.text.toString()
        val answertext = answer.text.toString()
        val returnIntent = Intent()

        returnIntent.putExtra("test", questiontext)
        setResult(Activity.RESULT_OK, returnIntent)
        finish()

        btn3.setOnClickListener{
            startActivity(intent)
        }
    }
}

【问题讨论】:

  • onActivityResult 被解释为onCreate 中的本地函数,因为您放错了一个或两个}
  • 我应该把 } 放在哪里?
  • 您需要在} 关闭onCreate 的主体之后或onCreate 函数之前声明onActivityResult
  • 当我尝试执行任一操作时,我都无法使用我的 activityCode 和 startActivityforResult 代码。我试图以某种方式定位它,以便在单击按钮时发生所有这一切,以便传输数据。有点不知所措

标签: android kotlin


【解决方案1】:

您的Newbtn 活动需要一个onCreate 函数和一个onActivityResult,两者都在同一级别(活动内部)。现在你有一个嵌套在另一个里面,并且在一个未关闭的点击监听器 lambda 中。

看一下IDE里面的竖线:

看看每当你打开一个作用域时,比如使用函数或 lambda,有一条垂直线从你打开作用域的地方到你关闭它的地方,即右大括号在哪里?看看btn.setOnClickListener 是如何延伸到比它应该结束的地方更远的地方? onActivityResult 是如何插入其中的?

当支撑弄乱时,您可以使用这些指南来帮助您清理东西,并确保东西嵌套正确。所以onActivityResult 应该与onCreate 处于相同的缩进级别,应该在onActivityResult 的左大括号之前关闭 - 两个单独的行,一个接一个,每一行都以一个右大括号结尾。


您不能引用activityCode,因为您在点击侦听器 lambda 中定义它,它是那里的局部变量,您无法从外部看到它。它不会在您当前的代码中抱怨,因为您有 onActivityResult 嵌套 inside 该 lambda,它可以在其中看到变量 - 但该代码已损坏,因为该函数无论如何都不应该存在。

只需将 activityCode 值粘贴在类中的某个位置,甚至在它之外(像这样的常量非常适合 const val ACTIVITY_CODE = 2 声明)。基本上,您的onActivityResult 函数需要能够处理任何传入的结果,并引用它应该处理的可能的识别代码。这些不应该在点击侦听器中秘密定义,因为活动会返回结果并说“2 是什么意思???”

【讨论】:

    猜你喜欢
    • 2020-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    • 1970-01-01
    • 1970-01-01
    • 2019-07-02
    • 1970-01-01
    相关资源
    最近更新 更多