Когда я пытаюсь найти RecycleView
по идентификатору, я получаю следующую ошибку .
Ошибка: - Ошибка вывода типа: недостаточно информации для вывода параметра 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
}
}
android
android-layout
kotlin
type-inference
Равиндра Кушваха
источник
источник
<>
когда я его использую, он выдает ошибку.Вы находитесь на уровне API 26, где тип возвращаемого
findViewById
теперь родовымT
вместоView
и , следовательно , может подразумеваться. Вы можете увидеть соответствующий список изменений здесь .Итак, вы должны уметь это делать:
val recycler_view = findViewById<RecyclerView>(R.id.recycler_view)
Или это:
val recycler_view: RecyclerView = findViewById(R.id.recycler_view)
источник
В нем
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
синтаксиса.Для получения дополнительной информации по этой теме перейдите по этой ссылке: - Щелкните здесь
источник
Обычно Kotlin может определить ваш тип, используя информацию, указанную в скобках.
В этом случае это невозможно, поэтому вам придется указать его явно следующим образом
Не совсем уверен в типе, но именно так вы должны его указать
Я хотел бы добавить, что с помощью Anko вы можете еще больше упростить свой код следующим образом:
val recycler_view : RecyclerView = find(R.id.recycler_view)
источник
Добавьте эту строку в свой код как «Все, что вы используете».
val tvHello = findViewById<TextView>(R.id.tvHello)
источник
Вы можете игнорировать присвоение идентификаторов переменным в kotlin. Вам просто нужно использовать плагин
Вставьте это в свой градиент
apply plugin: 'kotlin-android-extensions'
и тогда вам не нужно назначать идентификаторы для var, вы можете просто сделать это как
источник
Попробуй это:
Здесь
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 }
источник
Вам даже не нужно создавать объект, чтобы делать что-то с представлением. Вы можете просто использовать идентификатор. Например, Котлин
то же самое, что и Java
источник
Не удалось получить доступ к компонентам пользовательского интерфейса, например, OP выглядит так, как показано ниже, внутри приложения gradle:
plugins { ... id 'kotlin-android-extensions' }
Несмотря на то, что после добавления этой строки студия Android все еще не смогла автоматически разрешить импорт для синтетики kotlin, поэтому вам может потребоваться аннулировать кеш и перезапустить.
Если все еще не работает, импортируйте вручную в зависимости от просмотров
Обновление - 2
Если вы получаете это информационное предупреждение -
плагин kotlin-android-extensions будет устаревшим. Так что добавьте ниже в свое приложение gradle
android { ... buildFeatures { viewBinding true } }
источник