gpt4 book ai didi

android - Android Studio 和 Main Activity.kt 需要成员声明的问题

转载 作者:行者123 更新时间:2023-12-03 17:45:48 25 4
gpt4 key购买 nike

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

当他们输入 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);
}
}

最佳答案

1) 了解你的语言语法

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

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

2)在正确的时间找到 View
Activity对象由具有公共(public)空构造函数的框架为您实例化。目前没有可找到的 View 。如果您调用findViewById setContentView 之前的任何时间它将返回 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修饰符,允许您声明一个不可为空的变量,但稍后在 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)
}

不要使用委托(delegate)。它为每个 lazy 创建一个不必要的持有者对象,太浪费了。

您也可以使用 Kotlin Android Extensions只需访问 toolbar直接因为所有繁重的工作都是为您完成的。
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main2)
setSupportActionBar(toolbar)
}

或者,您可以使用 View Binding从 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)
}

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

关于android - Android Studio 和 Main Activity.kt 需要成员声明的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47270801/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com