티스토리 뷰

Android App Coding

프래그먼트 Fragment

IT Knowledge Share 2021. 7. 8. 17:08
반응형

프래그먼트에 대해 알아봅니다.

 

우선 프래그먼트가 등장하게된 배경에 대해 이해해 봅니다. 프래그먼트는 다음의 두 가지 문제로 인해 등장하게 되었습니다.

1. 액티비티가 가지고 있는 한계점

2. 안드로이드 디바이스의 다양성

 

안드로이드의 한 화면을 의미하는 액티비티는 여러 종류의 뷰를 포함할 경우, 화면이 한 없이 길어지고 복잡하게 됩니다. 단지 이미지나 버튼 한 두개 정도가 아니라, 하나의 액티비티에 정말 많은 종류의 하위 뷰가 존재한다면, 그만큼 관리포인트가 많아지고, 유지보수에 어려움을 겪을 수 있습니다.

 

반응형

안드로이드 디바이스는 모바일뿐만 아니라 태블릿, 안드로이드 TV 등 여러 사이즈가 존재할 수 있습니다. 이렇게 사이즈가 너무 다양하기에 기존 모바일 사이즈의 다양성을 해결하기 위해 DP 단위를 사용해도 문제는 해결되지 않습니다. 이러한 경우, 한 액티비티의 여러 뷰를 나눠서 마지 한 페이지에 두 페이지가 존재하는 것처럼 보여주면 효과적일 수 있습니다.

 

이처럼, 프래그먼트는 액티비티의 여러 부분을 나눠서 책임지는 역할을 합니다.

 

프래그먼트는 다음의 두 가지 특징을 지니고 있습니다.

1. 프래그먼트 생명주기를 지니고 있습니다.

출처: developers

2. 액티비티에 종속적이기 때문에, 액티비티가 사라지면, 프래그먼트도 같이 사라집니다.

 

프래그먼트를 만드는 방법은 두 가지가 있습니다.

1. XML을 통해서 만드는 방법

2. 코딩(동적)을 통해서 만드는 방법

 

그럼 XML을 통해서 프래그먼트를 만드는 방법에 대해서 알아봅니다.

 

다음의 액티비티 XML 파일의 코드를 확인합니다. 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:orientation="vertical"
    tools:context=".FragmentActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="프래그먼트"
        android:textSize="50dp"/>

    <fragment
        android:id="@+id/fragment_one"
        android:name="com.example.myapplication.FragmentOne"
        android:layout_width="match_parent"
        android:layout_height="300dp"/>


</LinearLayout>

<fragment> 태그를 사용해 프래그먼트로 관리해 줄 액티비티의 한 부분을 만들어 줄 수 있습니다. 태그를 지정할 때 소문자인 점을 주의하십시오. android:name="com.example.myapplication.FragmentOne"의 경우, 속성 name으로는 프래그먼트 수명주기 코드가 들어간 코틀린 파일명이 옵니다. 또한 다른 액티비티의 하위 뷰와 다르게 ID값은 필수입니다.

 

위의 액티비티와 연결된 코틀린 파일은 비워두었습니다.

class FragmentActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_fragment)

    }
    
    //이하 생명주기 생략

setContentView(R.layout.activity_fragment)와 같이 setContentView를 사용해 onCreate 순간에서 원하는 액티비티만 표시해주는 역할만 합니다.

 

프래그먼트 코틀린 파일을 확인합니다. 액티비티와 마찬가지로 생명주기가 들어가는 부분입니다.

class FragmentOne: Fragment(){

    override fun onAttach(context: Context) {
        super.onAttach(context)
        
    }

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

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        return inflater.inflate(R.layout.fragment_first, container, false)

    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
  
    }

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
    }

    override fun onStart() {
        super.onStart()
    }

    override fun onResume() {
        super.onResume()
    }

    override fun onPause() {
        super.onPause()
    }

    override fun onStop() {
        super.onStop()
    }

    override fun onDestroyView() {
        super.onDestroyView()
    }

    override fun onDetach() {
        super.onDetach()
    }
}

먼저 프래그먼트 만드려면, Fragment( )를 상속받아야 합니다. class FragmentOne: Fragment() 부분처럼 상속을 받을 때, androidx의 Fragment( )로 상속받으시기 바랍니다. deprecated된 android보다 androidx가 최신입니다.

 

프래그먼트에서 뷰를 그려주는 부분은 onCreateView 부분입니다. inflater는 뷰를 그려주는 역할을 담당하며, container는 프라그먼트가 담당할 뷰가 속하게 될, '부모 뷰'를 의미합니다. 여기서 container는 액티비티 XML 파일에서 <fragment> 뷰 부분을 의미합니다.

 

return inflater.inflate(R.layout.fragment_first, container, false) 부분을 보면, layout 다음에 원하는 프래그먼트 레이아웃 리소스 파일을 위치시켜 줍니다. 이후 두 번째 인자로는 container, 즉 해당 프래그먼트 뷰가 실제 나타나게 될 자리를 말하는데 <fragment> 뷰 부분을 의미합니다. 세 번째 인자로는 false를 넣어 줍니다.

 

레이아웃에 원하는 프래그먼트 레이아웃 리소스를 만들어 줍니다.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:background="#E91E63"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="프라그먼트"
        android:textColor="#FFEB3B"
        android:textSize="50dp"/>

</LinearLayout>

 

이렇게 하게 되면, 액티비티에서 프래그먼트를 담당하는 부분이 onCreateView에서 원하는 프래그먼트 레이아웃을 불러와서 액티비티에 뷰를 표시하게 됩니다.

 

* 참고로 AndroidManifestXML 파일에는 <activity>만 표시되지, <fragment>는 표시되지 않은 점을 기억하시기 바랍니다.

반응형
댓글