问题与Android Studio和主要Activity.kt期待成员声明

我一直在试图通过下面的YouTube教程学习。 我正在使用Android Studio 3.1 Canary,并且在教程中遇到了同样的问题并陷入困境。 例如,如果你在3:30分钟的时候访问这个YouTube教程https://youtu.be/3RMboPhUbmg?t=210 。

当他们输入MaterialSearchView searchView; 它出现了一个红色的下划线,表示“期待成员声明”,无论我尝试多少次搜索,我都找不到答案。 这个错误的解决方案是什么? 谢谢

这是包含在Main2Activity.kt中的代码。 结果应该是调用或知道工具栏和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); } } 

1)了解你的语言语法

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

遵循严格的规定,用Java写你的代码。 稍后当你对自己的工作更有信心的时候切换到Kotlin。 一次集中一件事。

2)在正确的时间查找意见

这个Activity对象是由一个公共的空构造函数为框架提供的。 在这个时候没有意见可以find。 如果您在setContentView之前的任何时候调用findViewById ,它将返回null并崩溃,如果您尝试将其分配给不可为空的variables。

以上都适用于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修饰符,它允许您声明一个不可为空的variables,但稍后在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委托。 当您第一次访问variables时,该variables将被分配。

 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) } 

您还可以使用Kotlin Android扩展,并直接访问toolbar ,因为所有繁重的工作都是为您完成的。

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

看来你是用Java语法来声明你的searchViewtoolbarvariables,而不是Kotlin语法,所以编译器不知道你在声明什么。

所以把声明改为:

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

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