본문 바로가기

Android

수정사항 유 [Android] Fragment 프레그먼트

목차

1. Fragment란?
2. Back Stack
3. Fragment 의 생명주기


 

1. Fragment란?

여러 화면을 가지고 있는 애플리케이션은 여러 Activity를 가지고 있는 애플리케이션을 의미한다.
Activity는 독립된 실행단위로 메모리를 많이 소모하는데 독립된 실행단위가 아닌 화면만 필요한 경우 Activity 보다는 Fragment를 활용하는 것이 효율적이다.
Fragment는 Activity내의 작은 화면 조각으로 Activity의 화면을 여러 영역으로 나누어 관리하고 하는 목적으로 사용한다.

2. Back Stack

Fragment는 Activity가 아니므로 Back Stack에 올라가지 않음.
그러나 Fragment를 Back Stack에 포함시킬 수 있다.
-Activity에 올리는 첫 번째 Fragment는 제외하고 두 번째 Fragment 부터 Back Stack에 포함시킨다.
(모든 Fragment를 Back Stack에 누르면 마지막에 아무것도 없는 화면인 Activity가 실행되게 된다.)
안드로이드에서 back button은 현재 Activity를 종료한다.
Fragment는 Activity가 아니므로 Back Button으로 제거할 수 없는데 addToBackStack 메서드를 통해 Back Stack에 포함한 경우 Back Button으로 제거할 수 있다.
이를 통해 마치 이전 화면으로 돌아가는 듯한 효과를 줄 수 있다.
popBackStack 메서드를 사용하면 Back Stack에서 Fragment를 순차적으로 제거해 이전으로 돌아가는 효과를 얻을 수 있다.

3. Fragment 의 생명주기

Fragment 도 생명 주기를 가지고 있다.
각 생명 주기에 자동으로 호출되는 메서드가 제공되며 이 메서드를 통해 필요한 처리를 할 수 있다.
여기서 onResume() 만 집중적으로 볼게용.. 딴 건 뭐 ㅎㅎ

 

4. Activity의 역할

각 Fragment를 교환하고 관리하는 역할을 한다.
Fragment들이 사용할 데이터를 관리하는 역할을 한다.

애플리케이션 개발 시 눈에 보이는 화면을 Fragment로 만들어 사용할 경우 Activity는 Fragment들을 관리하는 역할을 하게 된다.

 

5. 애니메이션 사용

https://m3.material.io/styles/motion/transitions/transition-patterns

 

5. Fragment 만들어보기 실습

1. buildFeature

2. fragment 생성 

3. activity_main.xml 에서 fragmentcontainerview를 배치한다
-미리보기 창에 놓으려면 fragment가 생성이 되어 있어야함
-아니면 component tree에서만 붙일 수 있다

-미리보기에 fragmentcontainerView를 넣었다면 속성에서 name을 지워준다.

4. MainActivity.kt를 작성한다.
package kr.co.lion.android33_fragment

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.fragment.app.Fragment
import kr.co.lion.android33_fragment.databinding.ActivityMainBinding

// Activity의 역할 :
// 1. Fragment 들을 관리
// 2. 각 Fragment 들이 공통적으로 사용하는 데이터들을 관리

class MainActivity : AppCompatActivity() {

    lateinit var activityMainBinding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        activityMainBinding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(activityMainBinding.root)

        // MainFragment 가 보여지도록 한다.
        replaceFragment(FragmentName.MAIN_FRAGMENT)
    }

    // 지정한 Fragment를 보여주는 메서드
    fun replaceFragment(name:FragmentName){
        // Fragment를 교체할 수 있는 객체를 추출한다.
        val fragmentTransaction = supportFragmentManager.beginTransaction()
        // 새로운 Fragment를 담을 변수
        var newFragment:Fragment? = null

        // 이름으로 분기한다.
        when(name){
            FragmentName.MAIN_FRAGMENT -> {
                newFragment = MainFragment()

            }
            FragmentName.INPUT_FRAGMENT -> {

            }
        }
        if(newFragment != null){
            // Fragment를 교체한다.(이전 Fragment가 없으면 새롭게 추가하는 역할을 수행한다)
            // 첫 번째 매개 변수 : Fragment를 배치할 FragmentContainerView의 ID
            // 두 번째 매개 변수 : 보여주고하는 Fragment 객체를
            fragmentTransaction.replace(R.id.mainContainer, newFragment)
            // Fragment 교체를 확정한다.
            fragmentTransaction.commit()
        }

    }
}

// Fragment 들의 이름
enum class FragmentName{
    MAIN_FRAGMENT,
    INPUT_FRAGMENT
}

// 학생 정보를 담을 클래스
data class StudentInfo(var name:String, var age:Int, var kor:Int, var math:Int, var eng:Int)

5. fragment_main.xml

6. fregment_input.xml


7. MainFragment.kt
    ▼ 해당 코드를 아래와 같이 지워준다. (onCreateView만 남겨주고 지운다)
       ▼ 이렇게 지우고 binding까지 만들기는 기본
8. 잘 실행된다

 

Back Stack에 포함시키게 코드 작성해보자

1.
2.

1이 아니라 2번 처럼 해야하는 이유, 
즉 MainFregment 는 BackStack에 포함하지 않아야하는 이유,
 MainActivity의 빈화면이 나오지 않도록 하기위해 !
 MainFregment가 첫화면으로 보이고 있는 상태에서 앱 종료가 되도록 하기 위해 !

1. MainActivity.kt 수정


2. MainFregment.kt 수정

 

6. 애니메이션 적용하기

 

7. Activity에서 Fragment로 값 넘겨주기

Activity에서 Activity로 값을 넘길때는 intent를 이용해서 객체를 생성하여 전달하였지만
Fragment에서는 그게 안됨됨.
얘는 제공해주는