20230824 Fragment

기메단·2023년 8월 24일
0

TIL

목록 보기
26/44

Fragment

- 액티비티 위에서 동작하는 모듈화된 사용자 인터페이스
- 여러 개의 프래그먼트를 하나의 액티비티에 조합하여 창이 여러 개인UI를 구축할 수 있으며,
하나의 프래그먼트를 여러 액티비티에서 재 사용할 수 있다.
Activity vs Fragment

- Activity로 화면을 계속 넘기는 것보다 Fragment를 이용하면 이용량이 적어 속도가 더 빠르다.
- 재사용할 수 있는 레이아웃을 분리해서 관리 가능하다.
Fragment Class


MainActivity가 있는 폴더에 FirstFragment와 SecondFragment를 생성했다. 
Fragment xml

클래스를 생성하면 Xml 파일도 자동으로 생성된다. 

// FirstFragment

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".FirstFragment"
    android:background="@color/black">

    <!-- TODO: Update blank fragment layout -->
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="프래그먼트1"
        android:textAllCaps="false"
        android:textSize="40sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

// SecondFragment

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".SecondFragment"
    android:background="@color/black">

    <!-- TODO: Update blank fragment layout -->
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="프래그먼트2"
        android:textAllCaps="false"
        android:textSize="40sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>
activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <FrameLayout
        android:id="@+id/frameLayout"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginStart="10dp"
        android:layout_marginEnd="10dp"
        app:layout_constraintBottom_toTopOf="@+id/fragment1_btn"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">
    </FrameLayout>

    <Button
        android:id="@+id/fragment1_btn"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:text="Frag1"
        android:textAllCaps="false"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toStartOf="@+id/fragment2_btn"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/frameLayout" />

    <Button
        android:id="@+id/fragment2_btn"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:text="Frag2"
        android:textAllCaps="false"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@+id/fragment1_btn"
        app:layout_constraintTop_toBottomOf="@+id/frameLayout" />

</androidx.constraintlayout.widget.ConstraintLayout>
버튼을 누르면 각각의 fragment를 표시하고 싶기 때문에 
FrameLayout과 button 두개를 만들어줬다.
MainActivity.kt

class MainActivity : AppCompatActivity() {

    private val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }

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

        binding.apply {
            fragment1Btn.setOnClickListener{
                setFragment(FirstFragment())
            }
            fragment2Btn.setOnClickListener {
                setFragment(SecondFragment())
            }
        }
        setFragment(FirstFragment())
    }

    private fun setFragment(frag : Fragment) {
        supportFragmentManager.commit {
            replace(R.id.frameLayout, frag)
            setReorderingAllowed(true)
            addToBackStack("")
        }
    }
}
- add(int containerViewId, Fragment fragment) : 새로운 Fragment를 화면에 추가(ID영역에)

- replace(int containerViewId, Fragment fragment) : ID 영역에 추가된 fragment를 대체
 													기존에 쌓여있던 Fragment들을 다 제거하고 해당 Fragment를 추가한다.
- remove(Fragment fragment) : 추가된 Fragment 제거 

- commit() : 화면 적용 

- setReorderingAllowed() : 애니메이션과 전환이 올바르게 작동하도록 트랜잭션과 관련된 프래그먼트의 상태 변경을 최적화한다. 

- addToBackStack() : replace를 하면 기존의 Fragment들은 버려진다고 했었다.
 하지만 addToBackStack를 사용하면 Fragment를 버리지 않고 BackStack에 차곡차곡 모아둔다.
 이때 BackStack안에 들어가 있는 Fragment들은 Pause 상태로 유지된다.
결과

3개의 댓글

comment-user-thumbnail
2023년 8월 24일

공부하면서 깔끔하게 정리 잘하시네요! 오늘도 잘 보고 갑니다 ~ ~

답글 달기
comment-user-thumbnail
2023년 8월 25일

프레그먼트를 사용하면 액티비티를 하나만 사용해도 다양한 화면 구성을 할 수 있어 좋은 것 같아요 !!

답글 달기
comment-user-thumbnail
2023년 8월 25일

저도 현준님 게시물을 보니깐 보기좋으면서 깔끔하게 하고 싶어졌어요!

답글 달기