GDSC HUFS 3기/Android with Kotlin Team 4

[4팀]14-5~6 화면 구성하기:프래그먼트, 프래그먼트끼리 값 주고받기

gusals42 2021. 11. 9. 03:18

이 글은 이것이 안드로이드다 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

 

blank fragment 생성>하나는 receiver, 다른 하나는 sender로 설정

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로 값을 보낼 때는 setFragmentResultsetFragmentResultlistener로 쉽게 값을 전달 가능!!