강의

멘토링

커뮤니티

Inflearn Community Q&A

tizm4233217's profile image
tizm4233217

asked

[Absolute Beginner] Learn Android Kotlin by building 8 apps

Data Binding Explanation

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

Written on

·

287

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()
        }
    }
}
firebasekotlinandroid

Answer 2

1

bokchi님의 프로필 이미지
bokchi
Instructor

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

tizm4233217님의 프로필 이미지
tizm4233217
Questioner

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

감사합니다!

1

bokchi님의 프로필 이미지
bokchi
Instructor

안녕하세요 재헌님

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

 

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

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

tizm4233217's profile image
tizm4233217

asked

Ask a question