[4팀]14-5~6 화면 구성하기:프래그먼트, 프래그먼트끼리 값 주고받기
이 글은 이것이 안드로이드다 with 코틀린(개정판)를 참고하여 작성하였습니다.
작성자 : 정현민
개발환경은 Windows, Android Studio입니다.
1. 프래그먼트
What is fragment?
activity보다 가볍게 화면전환을 하기 위한 것
2. 목록에 해당되는 list fragment 만들기
blank fragment 생성>split에서 constraintlayout> Textview에서 string/title_list 작성
fragment tag를 끌고와 목록 중 선택
✔화면 안에 하나만 넣을 땐 fragment tag를 사용
✔그렇지 않은 경우, framelayout 사용
val binding by lazy {ActivityMainBinding.inflate(layoutInflater)}
-binding을 만들어주는 code
fun seFragment(){
// 1. 사용할 프래그먼트 생성
val listFragment = ListFragment()
//2. 트랜젝션 생성
val transaction = supportFragmentManager.beginTransaction()
//3. 트랜잭션을 통해 프래그먼트 삽입
transaction.add(R.id.framelayout, ListFragment())
transaction.commit()
3. 상세페이지에 해당되는 detail fragment 만들기
*list fragment와 동일한 layout 설정
//MainActivity
fun goDetail(){
val detailFragment = Detailfragment()
val transaction = supportFragmentManager.beginTransaction()
transaction.add(R.id.frameLayout, detailFragment)
//뒤로가기 기능 구현(프래그먼트 동작이 stack에 담김)
transaction.addToBackStack("detail")
transaction.commit()
}
fun goBack(){
onBackpressed()
}
✔list fragment의 next button에서는 goDetail 함수 출력하는 코드
✔detail fragment에서는 back button을 눌렀을 때, MainActivitiy의 goBack 호출
//ListFragment
override fun onAttach(context: Context) {
super.onAttach(context)
if(context is MainActivity)mainActivity=context
-MainActivity를 꺼내서 담아놓음으로써 MainActivity에서 함수가 제대로 작동할 수 있도록 연결해주는 코드
binding = FragmentlistBinding.inflate(inflater, container, false)
return binding.root
-binding해주는 코드
override fun onViewCreated(view: View, savedinstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.btnNext.setOnClicklistener {
mainActivity.goDetail()
}
}
-클릭하면 MainActivity에서 goDetail함수를 불러오는 코드
4. 프래그먼트끼리 값 주고받기
1) viewBinding부터 설정
:build gradle>buildFeatures 아래에 viewBinding true
2) TextView 생성
ReceiverFragment에는 '리시버', SenderFragment에는 button 두 개 생성> constraintlayout 설정
3) ReceiverFragment 코드
Ctrl+O> onViewCreated method
override fun onViewCreated(view: view, savedInstanceState: Bundle?) {
super.onviewCreated(view, savedInstanceState)
setFragmentResultlistener(requesKey: "request"){key, bundle ->
//수신 준비 완료
bundle.getString(key: "senderKey")?.let{it:String
binding.textView.text = it
}
}
4) SenderFragment 코드
override fun onViewCreated(view: view, savedInstanceState: Bundle?) {
super.onviewCreated(view, savedInstanceState)
with(binding){this:FragmentSenderBinding
btnYes.setOnClickListener {it:View!
//btnYes는 YES button 생성 시 지은 이름
val bundle = bundleOf(...pairs:"sendereKey" to "Yes"
//어떤 key에 어떤 값으로 bundle을 담겠다는 의미
setFragmentResult(requestKey: "request", bundle)
}
btnNo.setOnClickListener {it:View!
//btnNo는 NO button 생성 시 지은 이름
val bundle = bundleOf(...pairs:"sendereKey" to "No"
setFragmentResult(requestKey: "request", bundle)
}
}
}
▶Fragment to Fragment로 값을 보낼 때는 setFragmentResult와 setFragmentResultlistener로 쉽게 값을 전달 가능!!