뷰 바인딩
사용법
gradle 추가
// 안드로이드 스튜디오 4.0 이상
android {
...
buildFeatures {
viewBinding true
}
}
// 안드로이드 스튜디오 3.6 ~ 4.0
android {
...
viewBinding {
enabled true
}
}
액티비티
private lateinit var binding: ActivityMainBinding
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.textView.text = "테스트"
}
}
바인딩 클래스 이름은 규칙이 정해져있다.
Activity 이름 | Binding Class 이름 |
MainActivity | ActivityMainBinding |
XXXActivity | ActivityXXXBinding |
프래그먼트
class FragmentTest : Fragment() {
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// 1. 뷰 바인딩 설정
val binding = FragmentMenuBinding.inflate(inflater, container, false)
// 2. 바인딩으로 TextView 등에 접근
bindig.myTextView.text = "바인딩이 잘 되었어요!!"
// 3. 프래그먼트 레이아웃 뷰 반환
return binding.root
}
}
framgent_menu.xml 파일을 바인딩하려면, FragmentMenuBinding 클래스의 inflate()메서드를 호출해주면 된다.
(xml파일명의 첫글자와 언더바_ 다음 글자를 대문자로 바꾸고 Binding을 붙여주면 된다.)
val binding = FragmentMenuBinding.inflate(inflater, container, false)
프래그먼트는 뷰보다 더 오래 살아남음
바인딩 클래스는 뷰에 대한 참조를 가지고 있는데 뷰가 제거될 때(=onDestroyView) 이 바인딩 클래스의 인스턴스도 같이 정리해주는 것
역사
public class MainActivity extends AppCompatActivity {
private TextView nameView, phoneView, addressView; // 변수 선언
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
nameView = findViewById(R.id.name); // findViewById로 id를 찾아서 넣어준다.
phoneView = findViewById(R.id.phone);
addressView = findViewById(R.id.address);
}
}
예전에는 액티비티에서 뷰의 값을 변경하거나 뭔가 작업을 하려면
변수를 선언하고 findViewById를 이용해서 xml의 뷰와 변수를 연결시켜주는 작업을 해야 했다.
덕분에 코드가 항상 길어지고 더러워졌다.
view binding은 이 findViewById를 대체할 수 있는 기능이다.
3.5 버전까지는 개발자들이 findViewById를 사용했었다.
Butter knife라는 라이브러리나 extension을 이용해서 불편함을 해결했다고 한다.
그러다가 3.6 버전에서 이를 대체할 수 있는 view binding이 나오게 된다.
코틀린에서는 이 뷰 바인딩 작업조차 안 하고
id를 바로 변수처럼 사용할 수 있는 Kotlin Synthetic이 생겼다.
하지만 다음과 같은 문제가 있어 4.1 버전에서 Kotlin Synthetic은 deprecated 되었다.
- 전역 네임 스페이스가 오염된다.
- 개발자가 실수로 다른 레이아웃의 동일한 id를 가진 뷰를 가져오면서 NullPointException이 발생할 가능성이 있다.
- Kotlin만 지원이 가능하다.
현재는 자바와 코틀린 둘 다 view binding을 사용한다.
findViewById도 사용할 수 있지만, 속도도 느리고 안전하지 못하다.
'Kotlin' 카테고리의 다른 글
안드로이드 뷰(Android View) (0) | 2022.02.09 |
---|