即使在上面的行中声明了 val,也期望成员声明

Expecting member declaration even though the val is declared the line above

我查看了有关此错误的所有其他问题,但其中 none 有帮助。我试图在我的布局文件中创建对按钮的引用,当我设置 onClickListener 时,我得到“期待成员声明”。这发生在第 35 行。旁注,我还在同一行收到错误“函数声明必须有一个名称”。这是代码:


import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import android.widget.*

private var userLocation: Any = ""

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val spinner: Spinner = findViewById<Spinner>(R.id.locations)
        spinner.adapter = ArrayAdapter(
            this,
            android.support.v7.appcompat.R.layout.support_simple_spinner_dropdown_item,
            resources.getStringArray(R.array.rooms)
        )
        spinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
            override fun onItemSelected(
                adapterView: AdapterView<*>?,
                view: View?,
                position: Int,
                p3: Long
            ) {
                userLocation = adapterView?.getItemAtPosition(position)!!
            }
            override fun onNothingSelected(p0: AdapterView<*>?) {

            }
        }
    }
    val button: Button = findViewById<Button>(R.id.button)
    button.setOnClickListener{
        Toast.makeText(this, "Selected $userLocation", Toast.LENGTH_SHORT).show()
    }
}

这些代码行:

    val button: Button = findViewById<Button>(R.id.button)
    button.setOnClickListener{
        Toast.makeText(this, "Selected $userLocation", Toast.LENGTH_SHORT).show()
    }

你已经在任何函数之外定义了。这意味着 button 是您定义的 class-level 属性。在调用任何函数之前初始化属性,因此此 findViewById 调用将在运行时失败,因为它将在 onCreate().

之前调用

而且你不能简单地在一个函数的顶层调用一个像 setOnClickListener 这样的函数。这就是为什么出现“期待成员声明”错误。

您需要将所有这些代码移动到您的 onCreate() 函数中。