본문 바로가기
Android

[Android] Java 에서 Kotlin 으로 넘어가기 4. Fragment

by bryan.oh 2022. 2. 27.
반응형

Kotlin Fragment 사용하기

 

우선 Activity 와 Fragment 의 차이는 lifecycle 을 봐도 알수가 있습니다.

Activity LifeCycle

Fragment 의 LifeCycle

요약하면, 
Activity 는 무거움. Fragment 가벼움.
기능에 따라 다르겠지만,
예를들어 5개의 Activity로 만든 앱 보다는 1개의 Activity 와 5개의 Fragment로 만든 앱이 더 가볍고 (화면전환이) 빠릅니다.

 

Fragment 만들기

fragment package를 만들어서 fragment 를 관리합니다.
(프로젝트가 크다면, fragment 들을 기능별로 나누는게 좋습니다)

그리고 Empty Fragment 생성.

기본적으로 생성되는 코드는 아래와 같습니다.

파라메터 받는 예제가 있습니다.

import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.bryan.selfdentlight.R

// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private const val ARG_PARAM1 = "param1"
private const val ARG_PARAM2 = "param2"

/**
 * A simple [Fragment] subclass.
 * Use the [LightFragment.newInstance] factory method to
 * create an instance of this fragment.
 */
class LightFragment : Fragment() {
    // TODO: Rename and change types of parameters
    private var param1: String? = null
    private var param2: String? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        arguments?.let {
            param1 = it.getString(ARG_PARAM1)
            param2 = it.getString(ARG_PARAM2)
        }
    }

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_light, container, false)
    }

    companion object {
        /**
         * Use this factory method to create a new instance of
         * this fragment using the provided parameters.
         *
         * @param param1 Parameter 1.
         * @param param2 Parameter 2.
         * @return A new instance of fragment LightFragment.
         */
        // TODO: Rename and change types and number of parameters
        @JvmStatic
        fun newInstance(param1: String, param2: String) =
            LightFragment().apply {
                arguments = Bundle().apply {
                    putString(ARG_PARAM1, param1)
                    putString(ARG_PARAM2, param2)
                }
            }
    }
}

Layout 은 

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".fragment.LightFragment">

    <!-- TODO: Update blank fragment layout -->
    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="@string/hello_blank_fragment" />

</FrameLayout>

 

Activity -> Fragment

val transaction = supportFragmentManager.beginTransaction();
transaction.replace(R.id.main_fragment_content, LightFragment())
transaction.addToBackStack(null)
transaction.commit()

R.id.main_fragment_content 는 activity_main.xml 에 있는 layout 의 id 입니다.

거기에 fragment 가 들어갑니다.

 

Fragment 종료하기

fragment.kt 의 onClick 어딘가에서

activity?.supportFragmentManager?.beginTransaction()?.remove(this)?.commit()

 

728x90
반응형

댓글