Android Studio 和 Main Activity.kt 期待成员声明的问题

Issue with Android Studio and Main Activity.kt expecting member declaration

我一直在尝试通过关注 YouTube 教程来学习。我正在使用 Android Studio 3.1 Canary,我在教程中遇到了同样的问题并卡住了。例如,如果您在 3:30 分钟标记处转到此 YouTube 教程 https://youtu.be/3RMboPhUbmg?t=210

当他们输入MaterialSearchView searchView时;它为我显示了一条红色下划线 "expecting member declaration",无论我尝试搜索多少次,我都找不到答案。这个错误的解决方案是什么?谢谢

这是 Main2Activity.kt 中包含的代码。结果应该是调用或知道 toolbar 和 materialsearchview 对象

import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.support.v7.widget.Toolbar
import com.miguelcatalan.materialsearchview.MaterialSearchView
import kotlinx.android.synthetic.main.activity_main2.*

class Main2Activity : AppCompatActivity () {
    **MaterialSearchView searchView;**  "expecting member declaration error"
    **Toolbar  toolbar;** "expecting member declaration error"
    Toolbar toolbar = (Toolbar) view.findViewById(R.id.toolbar);
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        toolbar=(Toolbar()) findViewbyId(R.id.toolbar);
        setSupportActionBar(toolbar);
    }
    *private void searchViewCode()
    {
        searchView=(MaterialSearchView)findViewById(R.id.search_view);
    }
}

您似乎是在使用 Java 语法而不是 Kotlin 语法声明 searchViewtoolbar 变量,因此编译器无法理解您声明的内容。

因此将声明更改为:

var searchView: MaterialSearchView? = null
val toolbar: Toolbar = view.findViewById(R.id.toolbar) as Toolbar 

或者如果您使用的是 Kotlin Android 扩展,您应该能够像这样检索工具栏(直接使用视图 ID):

1) 了解您的语言语法

您的教程在 Java 中。你尝试用 Kotlin 编写。 Java 和 Kotlin 有不同的语法,如果您在 Kotlin 中逐字复制本教程,它将失败。

按照教程在 Java 中编写代码。当您对自己所做的事情更有信心时,请稍后切换到 Kotlin。一次专注于一件事。

2) 在合适的时间寻找观看次数

Activity 对象由框架使用 public 空构造函数为您实例化。目前找不到任何视图。如果您在 setContentView 之前的任何时间调用 findViewById,它将 return null 并在您尝试将其分配给不可为 null 的变量时崩溃。

以上内容适用于 Java 和 Kotlin。

对于 Java,请按照教程进行操作。它应该看起来像这样:

Toolbar toolbar; // Declare the variable here so it's accessible outside of onCreate.

@Override
public void onCreate(@Nullable final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main2); // Inflate view hierarchy.
    toolbar = (Toolbar) view.findViewById(R.id.toolbar); // Find your views.
    setSupportActionBar(toolbar);
}

在 Kotlin 中有多种选择。

您可以使用 lateinit 修饰符,它允许您声明一个不可为 null 的变量,但稍后在 onCreate 中分配它。

lateinit var toolbar: Toolbar

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main2)
    toolbar = findViewById(R.id.toolbar) as Toolbar
    setSupportActionBar(toolbar)
}

或者您可以使用 lazy 委托。变量将在您首次访问时分配。

val toolbar: Toolbar by lazy(LayzThreadSafetyMode.NONE) {
    toolbar = findViewById(R.id.toolbar) as Toolbar
}

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main2)
    setSupportActionBar(toolbar)
}

不要使用委托。它为每个 lazy 创建了一个不必要的 holder 对象,这很浪费。

您也可以使用 Kotlin Android Extensions 并直接访问 toolbar,因为所有繁重的工作都已为您完成。

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main2)
    setSupportActionBar(toolbar)
}

或者,您可以使用自 Android Studio 3.6 Canary 11 起可用的 View Binding

private lateinit var binding: ActivityMain2Binding

@Override
fun onCreate(savedInstanceState: Bundle) {
    super.onCreate(savedInstanceState)
    binding = ActivityMain2Binding.inflate(layoutInflater)
    setContentView(binding.root)
    setSupportActionBar(binding.toolbar)
}

您将获得第一个选项的高性能和最重要的强类型安全性。

在我的例子中,问题是从 .PDF 中复制和粘贴的不可见字符

请注意,在下面的代码段中,“{”和 'onClick' 之间有两个字符。

setOnClickListener { ​onClick(item) }

这就是我做噩梦的原因。

主要问题是语法,每当将 3 系列升级到 4 时。Java 语法转换为 Kotlin 语法。

Kotlin 语法:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main2)
   }
   }

Java 语法:

@Override
public void onCreate(@Nullable final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main2); // Inflate view hierarchy.
   }
   }

如果您想将 Kotlin 语法更改为 Java 语法。

之后回到mainActivity编程面板 工具 -> KOTLIN -> 显示 KOTLIN 字节码 然后检查 JVM 8 目标 Tick that.

之后无效catch/Restart

问题已解决。