강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

정재헌님의 프로필 이미지
정재헌

작성한 질문수

[왕초보편] 앱 8개를 만들면서 배우는 안드로이드 코틀린(Android Kotlin)

데이터바인딩(Databinding) 설명

DataBinding을 통해 버튼의 text를 바꿔보고 싶은데 생각처럼 동작하지 않습니다.

작성

·

293

0

안녕하세요 선생님의 데이터 바인딩 강의를 보던 중 버튼을 누를 때마다 버튼의 텍스트를 바꿀 수는 없을지 해서 코드를 작성해봤습니다. 

 

인터넷을 뒤져보니, xml에 <data> 와 그 안에 <variable> 을 잘 정의해주면 된다고 해서 <variable>의 name을 "activity" 라고 정하고 type은 기본으로 생성해준 MainActivity를 설정했습니다.

 

그리고 Button의 android:text의 값을 @{activity.text}라고 넣어줬습니다.(이후 MainActivity.kt 에서 생성해주었습니다.)

 

MainActivity.kt에서 text라는 이름을 가진 변수를 "0" 으로 초기화하고, xml에서 설정한 id를 binding 변수에서 찾아 text에 클릭할 때마다 1씩 증가하는 변수를 toString을 통해 넣어줬습니다. 혹시 몰라 Toast를 통해 text를 띄워보았습니다.

 

하지만 생각처럼 되지는 않았는데요. 혹시 왜인지 알 수 있을까요?

 

[XML]

<?xml version="1.0" encoding="utf-8"?>

<layout>
    <data>
        <variable
            name="activity"
            type="com.example.databinding_ex.MainActivity" />
    </data>
    <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/testBtnId"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            android:text="@{activity.text}"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">

        </Button>

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

 

[MainActivity.kt]

package com.example.databinding_ex

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.Toast
import androidx.databinding.DataBindingUtil
import androidx.databinding.ObservableField
import com.example.databinding_ex.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMainBinding
    private var clickedCount = 1
    var text = "0"

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

        // 2. with dataBinding
        binding = DataBindingUtil.setContentView(this, R.layout.activity_main)

        binding.testBtnId.setOnClickListener {
            text =(clickedCount++).toString()
            Toast.makeText(this, text, Toast.LENGTH_LONG).show()
            binding.invalidateAll()
        }
    }
}

답변 2

1

개복치개발자님의 프로필 이미지
개복치개발자
지식공유자

위의 링크로 공유드린 강의를 통해서 한번 활용해보시고, 잘 안되시면 좀 더 자세히 작성한 코드를 설명해주시면 도움드릴 수 있을 것 같습니다.

정재헌님의 프로필 이미지
정재헌
질문자

공유해주신 개복치개발자님의 유튜브 덕분에 문제점을 해결할 수 있었습니다.

감사합니다!

1

개복치개발자님의 프로필 이미지
개복치개발자
지식공유자

안녕하세요 재헌님

생각되로 되지 않는다는게 어떤 의미이실까요?

 

데이터바인딩 관련해서 예제를 유튜브에 올려놓은게 있는데 한번 참고해보시겠어요?

https://www.youtube.com/watch?v=UvA_UHbXWvY&t=10s

정재헌님의 프로필 이미지
정재헌

작성한 질문수

질문하기