首页 > 解决方案 > 尝试使用 onclicklistener 时,我不断收到“修饰符覆盖不适用于本地功能”

问题描述

我正在尝试为一个小型测验应用程序编写代码。当您单击加号按钮时,它会将您带到一个单独的页面,您可以在其中输入问题和答案。当您单击复选按钮时,它将带您返回上一页,并创建一个新按钮,其中文本设置为问题。当我尝试在我的 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)
        }
    }
}

标签: androidkotlin

解决方案


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

查看 IDE 内的垂直线:

带有可见支撑参考线的代码截图

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

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


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

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


推荐阅读