Не удалось "findViewById" в Котлине. Получение ошибки "Ошибка ввода типа"
Я получаю следующую ошибку, когда пытаюсь найти RecycleView
по id.
Ошибка: -Ошибка ввода типа: недостаточно информации для вывода параметра T
![Ошибка]()
код:
class FirstRecycleViewExample : AppCompatActivity() {
val data = arrayListOf<String>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.first_recycleview)
val recycler_view = findViewById(R.id.recycler_view) as RecyclerView ///IN THIS LINE I AM GETTING THE ERROR
data.add("First Data")
data.add("Second Data")
data.add("Third Data")
data.add("Forth Data")
data.add("Fifth Data")
//creating our adapter
val adapter = CustomRecycleAdapter(data)
//now adding the adapter to recyclerview
recycler_view.adapter = adapter
}
}
Ответы
Ответ 1
Попробуйте что-то вроде:
val recyclerView = findViewById<RecyclerView>(R.id.recycler_view)
Вы можете использовать Kotlin Android Extensions
тоже для этого. Проверьте документ здесь.
С его помощью вы можете вызвать recycler_view
непосредственно в вашем коде.
Расширения Android Kotlin:
- В приложении
gradle.build
добавьте apply plugin: 'kotlin-android-extensions'
- В вашем классе добавьте импорт для
import kotlinx.android.synthetic.main.<layout>.*
, где <layout>
- это имя вашего макета.
- Чтобы это, вы можете вызвать
recycler_view
прямо в свой код.
Как это работает? В первый раз, когда вы вызываете recycler_view
, выполняется вызов findViewById
и кешируется.
Ответ 2
Вы находитесь на уровне API 26, где тип возврата findViewById
теперь является общим T
вместо View
и поэтому может быть выведен. Вы можете увидеть соответствующий список изменений здесь.
Итак, вы должны это сделать:
val recycler_view = findViewById<RecyclerView>(R.id.recycler_view)
Или это:
val recycler_view: RecyclerView = findViewById(R.id.recycler_view)
Ответ 3
Обычно Kotlin может вывести ваш тип, используя информацию, содержащуюся в скобках.
В этом случае он не может быть так, что вам нужно было бы явно указать это
findViewById<RecyclerView>(R.id.recycler_view)
Не совсем уверен в типе, но вот как вы должны его указывать
Я хотел бы добавить, что, используя Anko, вы можете упростить свой код следующим образом:
val recycler_view : RecyclerView = find(R.id.recycler_view)
Ответ 4
В Kotlin
мы можем получить идентификатор представления без использования синтаксиса findViewById
.
Например, мы используем следующий макет, из которого мы получим идентификатор представления и выполним операцию
Разметка
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/welcomeMessage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="Hello World!"/>
</FrameLayout>
Мы можем найти идентификатор представления, используя следующий код
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
welcomeMessage.text = "Hello Kotlin!" ////WE ARE GETTING THE IDS WITHOUT USING THE FINDVIEWBYID syntax
}
КАК?
Чтобы иметь возможность использовать его, вам нужен специальный импорт (тот, который я пишу ниже), но среда IDE может автоматически импортировать его. Не может быть проще!
import kotlinx.android.synthetic.main.YOUR_LAYOUT_NAME.*/// HERE "YOUR_LAYOUT_NAME" IS YOUR LAYOUT NAME WHICH U HAVE INFLATED IN onCreate()/onCreateView()
Нам нужно импортировать это свойство, чтобы получить идентификатор представления без использования синтаксиса findViewById
.
Для получения дополнительной информации по этой теме, пожалуйста, обратитесь к этой ссылке: - Нажмите здесь
Ответ 5
Попробуйте следующее:
Здесь bind
общая функция используется для привязки представления. его общая функция, которую он может использовать для любого вида.
class MyActivity : AppCompatActivity() {
private lateinit var recycler_view : RecyclerView
override fun onCreate(savedInstanceState: Bundle?) {
...
recycler_view = bind(R.id.recycler_view)
}
}
fun <T : View> Activity.bind(@IdRes res : Int) : T {
@Suppress("UNCHECKED_CAST")
return findViewById(res) as T
}
Ответ 6
Добавьте эту строку для своего кода как то, что вы используете с контроллером.
val tvHello = findViewById<TextView>(R.id.tvHello)
Ответ 7
Вы можете игнорировать предоставление идентификаторов переменным в kotlin. Вам просто нужно использовать плагин
Вставьте это в свой gradle
apply plugin: 'kotlin-android-extensions'
и тогда вам не нужно назначать идентификаторы для var, вы можете просто сделать это как
recycler_view.setAdapter(youradapter);
Ответ 8
Код: Другой способ сделать это.
class KotlinActivity : AppCompatActivity() {
var recycler_view: RecyclerView? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_kotlin)
recycler_view = findViewById<RecyclerView>(R.id.recycler_view)
}
}