마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

코틀린 바인딩 활용 질문!!

0 추천

바인딩에서 여기 빨갛게 구문 오류 뜨는데 해결이 안되네요.

binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
enerigpy (2,110 포인트) 님이 2023년 1월 9일 질문
어느 부분이 에러인지, 에러메세지는 뭔지, 안드로이드 스튜디오 컨텍스트 헬프의 추천 솔루션은 은 뭔지 먼저 살펴보세요. 에러가 나는 곳에 마우스를 가져다 대면 풍선도움말 같은 게 나올 겁니다. Build -> Clean build를 해보고 다시 빌드를 하시거나 안드로이드 스튜디오의 캐시를 클리어하고 다시 시작하는 것도 시도해 보세요.
private lateinit var binding: ActivityMainBinding

선언하고 DataBindingUtil를 import 하는데 <>에 MainActivityBinding 넣고 (this, ...) 그대로 넣는대로 해도 안되네요

DataBindingUtil.setContentView<>()
먼저 에러메세지를 확인하세요.
Val cannot be reassigned 이라고 밖에 안떠서 alt로 솔루션 수정도 불가하네요

2개의 답변

+1 추천
 
채택된 답변

제가 간단하게 테스팅해보면 별 이상없이 잘 됩니다. 아래는 제 소스와 설정입니다.

build.gradle

plugins {
    id 'com.android.application'
    id 'org.jetbrains.kotlin.android'
}

android {
    compileSdk 33

    defaultConfig {
        applicationId "com.mpark.myapplication"
        minSdk 23
        targetSdk 33
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    kotlinOptions {
        jvmTarget = '1.8'
    }
    buildFeatures {
        dataBinding true
    }
}

dependencies {
    implementation 'androidx.core:core-ktx:1.7.0'
    implementation 'androidx.appcompat:appcompat:1.5.1'
    implementation 'com.google.android.material:material:1.7.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
    testImplementation 'junit:junit:4.13.2'
    androidTestImplementation 'androidx.test.ext:junit:1.1.5'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
}

 

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <androidx.constraintlayout.widget.ConstraintLayout 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">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Hello World!"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

    </androidx.constraintlayout.widget.ConstraintLayout>

</layout>

 

MainActivity.kt

class MainActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
    }
}

 

이상없이 잘 빌드도되고 설치도 됩니다.

 

spark (225,780 포인트) 님이 2023년 1월 11일 답변
enerigpy님이 2023년 1월 11일 채택됨
Type mismatch: inferred type is ViewDataBinding! but ActivityIntroBinding was expected

이렇게 뜨네요 ㅜㅠ
+1 추천

"Val cannot be reassigned"

코틀린의 val 변수는 읽기전용이므로 값을 재할당할 수 없습니다. 자바의 final과 같습니다. 따라서 올리신 코드와 메세지는 서로 일치하지 않습니다. val 변수 중 값을 재할당하려고 하는 곳이 있는지 화인해 보시고 clean build도 해보세요.

spark (225,780 포인트) 님이 2023년 1월 11일 답변
네 그것도 해보고 incache도 해봤는데 안되네요

살펴보니까 type argument is not within its bounds: should be subtype of viewdatabinding 이게 나오구요
MainActivityBinding 이 ViewDataBidning을 상속받아아하는데, 그렇지 않다는 메세지인데요. 혹시  activity_main.xml은 제대로 설정을 했는지 다시 확인해 보세요.
...