Я пытался учиться в следующих учебных пособиях YouTube. Я использую Android Studio 3.1 Canary, и я попадаю в ту же точку в учебниках и застрял. Например, если вы перейдете к этому руководству YouTube https://youtu.be/3RMboPhUbmg?t=210 с отметкой 3:30 минут.
Когда они вводят SearchSearchView MaterialSearchView; он появляется для меня с красным подчеркиванием, говорящим «ожидая объявления участника» и независимо от того, сколько поисковых запросов я пытаюсь найти, я не могу найти ответ. Каково решение этой ошибки? благодаря
Это код, содержащийся в Main2Activity.kt. Результатом должен быть вызов или знание объектов панели инструментов и материалов
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. Вы пытаетесь написать в Котлине. Java и Kotlin имеют разный синтаксис, и если вы воспроизведете этот учебник дословно в Котлине, он потерпит неудачу.
Следуйте за turorial и напишите свой код на Java. Переключитесь на Kotlin позже, когда вы более уверены в том, что делаете. Сосредоточьтесь на одной вещи за раз.
Объект Activity
устанавливается для вас инфраструктурой с открытым пустым конструктором. В настоящее время нет никаких точек зрения. Если вы вызове findViewById
любое время до setContentView
он вернет 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); }
В Котлине есть несколько вариантов.
Вы можете использовать модификатор lateinit
, который позволяет объявлять переменную, не onCreate
но назначать ее позже в 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) }
Кажется, вы объявляете переменные searchView
и toolbar
синтаксисом Java, а не синтаксисом Kotlin, поэтому компилятор не понимает, что вы объявляете.
Поэтому измените декларацию на:
var searchView: MaterialSearchView? = null val toolbar: Toolbar = view.findViewById(R.id.toolbar) as Toolbar
или если вы используете расширения Kotlin для Android, вы можете получить панель инструментов так (напрямую используя идентификатор вида):