nueijeel
[Android] LayoutInflater에 대해 본문
Activity는 눈에 보이는 화면을 가진 독립적인 실행 단위이다.
Activity를 실행시키면 출력되는 화면은 xml이라는 파일로 구성되어 있고 이 레이아웃 파일에 배치된 뷰들을 동작하게 하려면 코드로 처리를 해야한다.
이때 코드에서 뷰에 접근하기 위해 뷰를 객체화 하는 과정이 필요한데 이것이 이전 포스팅에서 다룬 '뷰 바인딩(View Binding)'이다.
코틀린에서는 앱 수준의 빌드 파일에 뷰 바인딩을 셋팅해주면 해당 액티비티의 화면에 해당하는 바인딩 클래스가 자동으로 생성된다는 것까지 알아봤었다.
이번에는 레이아웃 파일의 뷰들이 객체화 되는 과정을 자세하게 알아보려 한다.
class MainActivity : AppCompatActivity() {
lateinit var activityMainBinding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
activityMainBinding = ActivityMainBinding.inflate(layoutInflater)
setContentView(activityMainBinding.root)
}
}
레이아웃 파일의 뷰 객체들을 가지고 있는 LayoutInflater의 객체 layoutInflater를 ActivityMainBinding.inflate()메서드의 인자로 넣으면 각 뷰 객체의 계층 구조를 나타내는 바인딩 객체가 반환된다.
inflate() 메서드는 ActivityMainBinding 클래스의 정적 메서드로 LayoutInflater 객체를 매개변수로 받아 레이아웃 파일을 인플레이트 하는 역할을 한다. 여기서 반환된 레이아웃 바인딩 객체가 activityMainBinding이라는 변수에 담기는 것이다.
LayoutInflater는 화면 UI를 구성하는 xml 파일을 통해 View 객체로 변환해주는 역할을 하는 클래스인데,
ViewBinding 예제에서 봤듯이 뷰 바인딩을 위해 바인딩 클래스와 함께 쓰인다.
LayoutInflater 클래스의 객체인 layoutInflater는 getLayoutInflater() 메서드가 호출되면 생성된다.
응? 근데 여기서는 getLayoutInflater() 메서드를 호출한 적이 없는데요...
→ AppCompatActivity를 상속받는 액티비티 클래스는 내부적으로 getLayoutInflater()메서드를 가지고 있기때문에 별도의 호출 없이도 메서드 반환 값인 layoutInflater 객체를 사용할 수 있는 것이다.
실제로 getLayoutInflater() 메서드는 android.app.Activity 클래스의 메서드 중 하나로, 위와 같은 상속 관계에 의해 AppCompatActivity에서도 접근이 가능하다.
코드 맨 마지막 줄은 뷰 바인딩 객체가 관리하는 view중 최상위 view(레이아웃)를 지정해 화면에 나타나게 하는 역할을 한다. root는 뷰 객체 계층에서 최상위 뷰를 반환한다.
val activityMainBinding = ActivityMainBinding.inflate(getLayoutInflater(), viewGroup, false)
레이아웃 파일의 뷰 바인딩 객체는 위와 같은 방식으로도 생성할 수 있다.
'Android > 공부' 카테고리의 다른 글
[Android] Data Store로 데이터 저장하기 (0) | 2023.12.02 |
---|---|
[Android] Object Animator를 활용한 간단한 애니메이션 구현하기 (1) | 2023.11.26 |
[Android] 카카오 로그인 구현하기 (+ api key 숨기는 방법) (0) | 2023.11.15 |
[Android] getIdentifier 메서드를 통해 리소스의 이름으로 ID 얻기 (0) | 2023.06.15 |