티스토리 뷰

반응형

Description

 기존에는 Android Studio에서 레이아웃에 있는 뷰들을 자바 소스코드에서 동적으로 사용하고 싶을 때, findViewById 메소드로 아래와 같이 뷰와 자바 소스코드를 연결해줘야 했다.

 

TextView tv_name = findViewById(R.id.tv_name);
TextView tv_addr = findViewById(R.id.tv_addr);

tv_name.setText("혀내");
tv_addr.setText("대한민국");

 

 

 하지만 매번 Activity와 Fragment에서 findViewById로 뷰와 연결해줘야 한다는 건 좀 번거로운 일이다. 그래서 뷰 바인딩(View Binding)을 통해 이런 연결 과정 없이 뷰를 변수처럼 바로 참조해보고자 한다.

 

 

 


사용 방법

 

1. build.gradle(:app)에 아래 코드르 복사한다.

android {
    
    ...

    buildFeatures {
        // 뷰 바인딩 활성화
        viewBinding true
    }
}

 

 

2. 레이아웃 파일을 하나 생성한다.

<LinearLayout ... >
        <TextView android:id="@+id/tv_name" />
        <ImageView android:cropToPadding="true" />
        <Button android:id="@+id/btn_ok"
            android:background="@drawable/rounded_button" />
    </LinearLayout>

 

참고) 뷰 바인딩을 적용하고 싶지 않은 레이아웃 파일은 최상위 뷰에 tools:viewBindingIgnore="true"를 추가한다.

<LinearLayout
            ...
            tools:viewBindingIgnore="true" >
        ...
    </LinearLayout>

 

 

3. layout의 Activity에서 아래 코드를 복사한다.

    // 전역 변수로 바인딩 객체 선언
    private var binding: ActivityMainBinding? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        //setContentView(R.layout.activity_main)

        // 바인딩 클래스의 인스턴스를 생성
        binding = ActivityMainBinding.inflate(layoutInflater)

        // 우리가 만든 루트 뷰를 액티비티에 표시
        setContentView(binding.root)

        // tv_name -> tvName으로 자동 변환되어 사용할 수 있음!
        binding.tvTitle.setText("Hello World..")
    }

    // 액티비티가 파괴될 때
    override fun onDestroy() {
        // binding class 인스턴스 참조 정리
        binding = null
        super.onDestroy()
    }
}

 


findViewById와의 차이점

- Null 안전성

 View Binding은 뷰를 직접 참조하기 때문에 NullPointerException이 발생하지 않는다.

 

- Type 안전성

 뷰를 직접 참조하기 때문에 타입 변환 에러가 발생하지 않는다.

 

 


참고자료: https://developer.android.com/topic/libraries/view-binding?hl=ko#kotlin

반응형