용도
: 레이아웃을 독립적인 구성 요소로 만들고, 복잡한 UI에서 재사용할 때 유용합니다.
장점
: Fragment는 독립적인 생명 주기를 가지며, 동적으로 UI를 추가하고 제거하는 데 적합합니다.
사용 예시
:
네비게이션, 탭을 포함한 구조에서 주로 사용.
복잡한 레이아웃을 여러 부분으로 나눠 관리할 때 사용.
용도
: 레이아웃을 직접 코드로 조작할 때 유용하며, XML과 Kotlin/Java 코드를 더 강력하게 연결할 수 있습니다.
장점: Null Pointer Exception을 방지하고, XML 속성을 코드에서 더 간편하게 사용할 수 있습니다.
예시:
// ViewBinding을 이용하여 레이아웃 재사용
val binding = LayoutHeaderBinding.inflate(layoutInflater)
parentLayout.addView(binding.root)
<merge> 태그 사용:
용도
: include의 성능을 개선하고 불필요한 부모 뷰 계층을 줄일 때 유용합니다.
장점
: 뷰 계층을 줄여 렌더링 성능을 향상시킬 수 있습니다.
사용 방법
:
include되는 레이아웃 파일에 태그를 사용하면 포함된 뷰들이 바로 부모에 추가되어 중복 계층을 제거합니다.
사용 예시:
<!-- layout_header.xml -->
<merge xmlns:android="http://schemas.android.com/apk/res/android">
<TextView
android:id="@+id/tvTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Header Title"/>
</merge>
용도
: 반복되는 레이아웃을 하나의 뷰로 만들어 재사용할 때 사용합니다.
장점
: 재사용성이 높고, 컴포넌트화되어 코드가 깔끔해집니다.
사용 방법
:
공통된 UI 요소를 커스텀 클래스로 만들어 XML에서 사용할 수 있게 만듭니다.
사용 예시:
// CustomView.kt
class CustomHeaderView @JvmOverloads constructor(
context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : ConstraintLayout(context, attrs, defStyleAttr) {
init {
LayoutInflater.from(context).inflate(R.layout.layout_header, this, true)
}
}
include는 잘못된 방법이 아니며, 여전히 사용될 수 있습니다. 그러나 레이아웃이 복잡하거나 동적으로 UI를 추가해야 할 때, 또는 더 효율적인 관리를 위해 최신 방식(예: Fragment, View Binding, Custom View 등)을 고려해 보는 것이 좋습니다. 상황에 맞는 방식을 선택하여 유지보수성과 성능을 개선할 수 있습니다.