안드로이드 데이터 바인딩에 대해 알아보자 #1

 

https://github.com/google-developer-training/android-kotlin-fundamentals-starter-apps/tree/master/AboutMeDataBinding-Starter

 

 

google-developer-training/android-kotlin-fundamentals-starter-apps

android-kotlin-fundamentals-starter-apps. Contribute to google-developer-training/android-kotlin-fundamentals-starter-apps development by creating an account on GitHub.

github.com

데이터 바인딩을 사용히랴면 build.gradle에 다음과 같이 설정 해 줍니다. android 내부 영역에 데이터 바인딩을 이용하겠다고 설정만 해주면 됩니다.

android {
     dataBinding {
        enabled = true
    }
}
        

 

그 다음에는 XML 파일을 <layout> 태그로 감싸줍니다.  xmls:android와 xmls:app은 LinearLayout에 있던걸 복사해서 넣어 줍니다.

<layout  xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto">
	<LinearLayout>
    </LinearLayout>
</layout>

 

이제 Activity로 이동하여 Binding 객체를 만들어 줍니다. 아래와 같이 ActivityMainBinding 변수를 선언합니다. 

private lateinit var binding: ActivityMainBinding

ActivityMainBinding클래스는 라이브러리에서 제공하는 클래스도 아니고, 개발자가 작성한 클래스도 아닙니다. <layout> 태그로 선언 된 XML을 위해 자동으로 만들어지는 클래스 입니다. ActivityMainBinding은 activity_main + Binding 입니다. 또 다른 예시로 XML 파일명이 aa.xml이라면 AaBinding이라는 클래스가 자동으로 만들어 집니다.

 

이제 onCreate()안의 setContentView()대신에 DataBindingUtil.setContentView()를 사용해 봅시다. activity_main과 MainActivity를 연결 시키기 위해 사용했던 setContentView()대신 DataBindingUtil.setContentView()을 사용하는 것 입니다.

 

onCreate()안의 setContentView()를 지우고 아래와 같이 위의 선언했던 binding변수에 DataBindingUtil.setContentView()리턴 값을 할당 해 줍니다.

 

binding = DataBindingUtil.setContentView(this, R.layout.activity_main)

 

그 후에 done_button 이라는 id를 가진 button에 onClickListener를 달아줍니다.

 binding.doneButton.setOnClickListener {
            addNickname(it)
        }

 

addNickname()이라는 함수는 원래 아래와 같이 findViewById를 사용 하였습니다. 이 코드를 binding을 이용해서 고쳐 보겠습니다.

 

private fun addNickname(view: View) {
        val editText = findViewById<EditText>(R.id.nickname_edit)
        val nicknameTextView = findViewById<TextView>(R.id.nickname_text)

        nicknameTextView.text = editText.text
        editText.visibility = View.GONE
        view.visibility = View.GONE
        nicknameTextView.visibility = View.VISIBLE

        // Hide the keyboard.
        val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
        imm.hideSoftInputFromWindow(view.windowToken, 0)
    }

 

아래와 같이 binding을 사용해서 addNickName()함수를 변경한 모습입니다. 아래 코드는 코틀린의 apply를 사용해서 좀 더 간결한 하게 만들 수 있습니다.

private fun addNickname(view: View) {
        binding.nicknameText.text = binding.nicknameEdit.text.toString()
        binding.nicknameEdit.visibility = View.GONE
        binding.doneButton.visibility = View.GONE
        binding.nicknameText.visibility = View.VISIBLE

        // Hide the keyboard.
        val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
        imm.hideSoftInputFromWindow(view.windowToken, 0)
    }
 binding.apply {
            nicknameText.text = binding.nicknameEdit.text.toString()
            nicknameEdit.visibility = View.GONE
            doneButton.visibility = View.GONE
            nicknameText.visibility = View.VISIBLE
}

 

댓글



Designed by JB FACTORY