* DataBinding 과 Fragment 사용법을 모른다면 Fragment DataBinding 보고 오는걸 추천합니다.
* 여기에서는 자세한 사용법은 생략합니다.
DataBinding을 Fragment에서 사용하기.
DataBinding - 라이브러리 추가
android {
buildFeatures {
dataBinding true
}
}
Fragment - ktx 라이브러리 추가
dependencies {
implementation("androidx.fragment:fragment-ktx:1.4.1")
}
파일 구조는 이렇습니다.
1. activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<FrameLayout
android:id="@+id/frameLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="50dp"/>
</LinearLayout>
</layout>
FrameLayout 하나 들어가있는 Activity입니다.
Databinding 을 하기위해 전체코드를 <layout> </layout> 으로 감쌌습니다.
2. fragment_test.xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white"
tools:context=".TestFragment">
<!-- TODO: Update blank fragment layout -->
<TextView
android:id="@+id/fragmentText"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:text="@string/hello_blank_fragment"
android:textSize="40sp"/>
</FrameLayout>
</layout>
fragment 입니다. fragment에서도 dataBinding을 위해 전체코드를 <layout> </layout> 으로 감쌌습니다.
3. MainActivity
class MainActivity : AppCompatActivity() {
private val binding by lazy {ActivityMainBinding.inflate(layoutInflater)}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(binding.root)
supportFragmentManager.commit {
replace(R.id.frameLayout, TestFragment())
setReorderingAllowed(true)
addToBackStack("")
}
}
}
MainActivity 에서는 Fragment를 붙이는 작업만 들어있습니다.
4. TestFragment
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
val binding : FragmentTestBinding = DataBindingUtil.inflate(inflater, R.layout.fragment_test, container, false)
binding.fragmentText.text = "DataBinding을\n사용했어요"
return binding.root
}
TestFragment는 onCreateView() 안에만 수정했는데요.
Activity는 onCreate()에서 layout객체생성 및 초기화 이런걸 했는데
Fragment에서는 onCreateView()에서 layout객체 생성 및 초기화를 합니다.
이유는 Activity와 Fragment에 LifeCycle이 다르기 때문입니다.
여기서 중요한점은 Fragment는 setContentView가 없습니다.
Activity 에서는 레이아웃 파일을 객체화 해서 사용하기위해 setContentView() 안에 레이아웃파일을 명시해 사용했는데요.
Fragment는 setContentView가 없습니다. 그래서 직접 레이아웃 객체를 생성하는 inflate 작업을 해야합니다.
Activity에서 DataBinding을 할때는 DataBindingUtil.setContentView를 사용한 방면
Fragment에서는 DataBindingUtil.inflate 를 하는 모습입니다.
이제 받아온 Databinding을 가지고 Fragment의 layout에 접근해서 초기화나 변경이 가능합니다.
binding.fragmentText.text = "" 이부분입니다.
그리고 마지막으로 onCreateView에서는 return값으로 View를 리턴해줘야하는데
binding.root : .root 에는 View정보가 있다. 그래서 받아온 데이터바인딩의 . root를 해주면 된다.
'Android-Kotlin > JetPack' 카테고리의 다른 글
[Android] LiveData 란? (0) | 2022.06.25 |
---|---|
[Android] ViewModel을 Fragment에서 간단 사용 - Kotlin (0) | 2022.06.24 |
[Android] ViewModel 개념 (0) | 2022.06.24 |
[Android] DataBinding 개념 및 간단 사용법 - Kotlin (0) | 2022.06.21 |