기존에 findViewById로 사용하던 것은 속도도 느리고, NullPointException(?맞나) 이 생길 수도 있는 문제가 있었다
그리고 매번 id를 확인해야해서 귀찮았다ㅜㅜ
ViewBinding은 레이아웃 생성시 ViewBinding 관련 클래스가 내부에 자동생성되어, 생성한 객체로 해당 레이아웃의 위젯에 접근을 할 수 있다!
설정
build.gradle (app)
android {
buildFeatures {
viewBinding = true
}
}
이제 ViewBinding을 사용할 수 있게 되었다!
레이아웃 생성시 마다 레이아웃 이름 + Binding 이라는 이름을 갖는 ViewBinding 클래스가 생기는 것임을 기억하자
이제 코드에서 사용해보자
예제
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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">
<TextView
android:id="@+id/text_id"
android:layout_width="match_parent"
android:layout_height="50dp"
android:hint="@string/id"
android:textSize="15sp"
android:padding="10dp"/>
</LinearLayout>
MainActivity.kt
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.example.androidpractice.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding = ActivityMainBinding.inflate(layoutInflater)
binding.textId.setText("hi")
setContentView(binding.getRoot())
}
}
기존 코드에서 어떤 레이아웃을 보여줄건지 명시하는 부분이 없어졌고,
ActivityMainBinding 이라는 클래스에서 binding 객체를 생성하고
binding객체에서 textId와 getRoot를 호출하고 있다
textId는 TextView이고, 기존에 findViewById대신 위처럼 적어주면 TextView의 text를 설정할 수 있다!
binding. 까지 적었을 때 뒤에 올 수 있는 위젯들이 자동완성되는 점도 너무 좋다!
getRoot()는 layout의 activity_main.xml을 가리킨다고 할 수 있다
setContentView(R.layout.activity_main)
setContentView(binding.getRoot())
기존에 위에 코드에서, 아래쪽 코드로 바뀐 것이다.
root는 해당 레이아웃 자체를 나타내는 것임을 기억하자!
첨에 어떻게 레이아웃을 찾아가는지 좀 헷갈렸는데,
레이아웃이 생성됨에 따라 클래스가 생성되고, 그 클래스를 activity에서 선언하여 사용하니,
당연히 어떤 레이아웃을 가리키는지 알 수 밖에 없다는걸 이해하니 쉽고 간편했다!
'🌸 Frontend > 🤖 Android' 카테고리의 다른 글
[Android] 타이틀바 없애기 (0) | 2021.05.22 |
---|---|
[Android] 비밀번호 입력창 만들기 (0) | 2021.05.22 |
[Android] EditText에 border 만들기 (TextView, Button도 가능) (0) | 2021.05.22 |
[Android] lombok 사용 (getter, setter, constructor 자동생성) (0) | 2021.05.22 |
[Android][Glide] W/Glide: Load failed for with size (1) | 2021.05.21 |