Kotlin не распознает идентификатор XML-элементов Android

#java #android #kotlin

#java #Android #kotlin

Вопрос:

Привет, коллеги-программисты!

я пытаюсь вызвать элемент из моего XML-файла пример: «Кнопка» из моего activity.xml но MainActivity.kt не разрешает мой идентификатор, когда я пытаюсь вызвать его внутри кода, который я пытался очистить и перестроить проект, но все еще сталкиваюсь с проблемой, также приводящей к аннулированию перезапуска кэшей

вот так я хочу вызвать кнопку из моего acitivty_main.xml

button.setOnClickListener{ }

 MainActivity

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.mostafa.stringlength.R.id.editText



class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
  

кнопка.(я здесь пытаюсь вызвать кнопку), но мне ничего не показывает //

     }

}
  

активность XML :

 <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">


    <Button
        android:id="@ id/button"
        android:layout_width="138dp"
        android:layout_height="58dp"
        android:layout_marginStart="136dp"
        android:layout_marginEnd="137dp"
        android:layout_marginBottom="212dp"
        android:text="أظهار النتيجة"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="parent" />

    <EditText
        android:id="@ id/editText"
        android:layout_width="411dp"
        android:layout_height="360dp"
        android:layout_marginStart="43dp"
        android:layout_marginTop="44dp"
        android:layout_marginEnd="43dp"
        android:ems="10"
        android:inputType="textPersonName"
        android:text="ادخل النص هنا"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <LinearLayout
        android:layout_width="417dp"
        android:layout_height="195dp"
        android:orientation="vertical"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@ id/result"
            android:text="النتائج:"/>

    </LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
  

Комментарии:

1. Я не думаю, что вы можете использовать синтетический импорт в качестве переменной поля, попробуйте переместить его внутри onCreate метода

2. ничего не изменилось

Ответ №1:

Убедитесь, что у вас есть эти 2 строки в верхней части вашего файла gradle

 apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
  

и поместите

import kotlinx.android.synthetic.main.activity_main.* в вашем файле активности

Ответ №2:

Теперь раздел плагинов выглядит следующим образом:

 plugins {
    id 'com.android.application'
    id 'kotlin-android'
    id 'kotlin-android-extensions'
}
  

Комментарии:

1. Это работает, но теперь оно устарело!!

Ответ №3:

Расширения Kotlin для Android устарели. Вы можете использовать привязку данных или привязку просмотра, предлагаемую Jetpack.

Вам просто нужно включить эти строки в файл build.gradle вашего модуля:

 android {
...    

buildFeatures {
    viewBinding true
}
  

}

Будет сгенерирован объект привязки, основанный на вашем имени действия, например, MainActivity сгенерирует ActivityMainBinding

 private lateinit var binding: ActivityMainBinding
  

Теперь вы можете использовать эту переменную привязки для расширения представления и ссылки на представления в макете:

 class MainActivity : AppCompatActivity() {

private lateinit var binding: ActivityMainBinding

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    binding = ActivityMainBinding.inflate(layoutInflater)
    val view = binding.root
    setContentView(view)

    binding.result.text = "My “Result!"
}
  

}

Ответ №4:

Добавьте следующий оператор импорта вверху

 import kotlinx.android.synthetic.main. activity_main.*
  

Ответ №5:

Существует лучший способ, называемый привязкой представления. Это значительно упрощает задачу. Когда вы используете его, вам это не понадобится 'kotlin-android-extensions' .

https://developer.android.com/topic/libraries/view-binding#java

Ответ №6:

Пример решения

   val btn_start = findViewById<Button>(R.id.btnStart)
        btn_start.setOnClickListener{
            //Your code
        }