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

时间:2017-11-13 18:08:19

标签: android android-studio kotlin android-studio-3.1

我一直在尝试通过关注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);
    }
}

4 个答案:

答案 0 :(得分:3)

1)了解您的语言语法

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

关注turorial并用Java编写代码。稍后当你对自己正在做的事情更有信心时切换到Kotlin。一次只关注一件事。

2)在合适的时间查找视图

框架使用公共空构造函数为您设置Activity对象。目前还没有找到任何观点。如果您在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)
}

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

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

答案 1 :(得分:0)

您似乎使用Java语法声明了Name Next Due Qty-Want ---------------------------------- A 11/20/17 13 B 12/29/17 2 C 11/10/17 2 searchView变量,而不是Kotlin语法,因此编译器无法理解您要声明的内容。

所以将声明改为:

toolbar

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

答案 2 :(得分: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编程面板 工具-> KOTLIN->显示KOTLIN字节码 然后检查 JVM 8目标,并勾选

此后,无效的捕获/重新启动

问题已解决。

答案 3 :(得分:-2)

在我的情况下,问题是来自.PDF的不可见字符应有的复制和粘贴

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

setOnClickListener { ​onClick(item) }

这是我做噩梦的原因。