5

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

当他们输入 MaterialSearchView 时;它以红色下划线显示给我,上面写着“期待成员声明”,无论我尝试多少次搜索,我都找不到答案。这个错误的解决方案是什么?谢谢

这是 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);
    }
}
4

4 回答 4

10

1) 了解你的语言语法

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

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

2)在正确的时间找到视图

Activity对象由具有公共空构造函数的框架为您实例化。目前没有可找到的视图。如果您尝试将其分配给不可为空的变量,则在它返回并崩溃findViewById之前的任何时间调用。setContentViewnull

以上适用于 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修饰符,它允许您声明一个不可为空的变量,但稍后在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)
}

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

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

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

或者,您可以使用自 Android Studio 3.6 Canary 11 起可用的视图绑定。

private lateinit var binding: ActivityMain2Binding

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

您可以获得第一个选项的高性能和强大的类型安全性。

于 2017-11-14T06:50:51.737 回答
0

主要问题是语法,每当将3系列升级到4。Java语法转换为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 编程面板 TOOLS -> KOTLIN -> Show KOTLIN Bytecodes Then Check on the JVM 8 target勾选 它。

在那次无效捕获/重启之后

问题已解决。

于 2020-09-08T13:54:39.323 回答
0

就我而言,问题是从.PDF复制和粘贴的不可见字符

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

setOnClickListener { ​onClick(item) }

这就是我做噩梦的原因。

于 2018-08-28T22:15:49.023 回答
0

看来您是使用 Java 语法而不是 Kotlin 语法来声明变量searchViewtoolbar变量,因此编译器不理解您在声明什么。

因此,将声明更改为:

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

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

于 2017-11-13T20:20:39.510 回答