본문 바로가기

Android/Android Lecture

안드로이드 강의 8. Fragment를 사용하자!

안녕하세요~ 효그니에여>< 뭔가 피곤한 하루네요.
이번차시에는 Fragment에 대하여 알아볼건데요! 

안드로이드에서는 화면을 바꿀때 두가지 방법이 제공되요!

하나는 화면 하나를 구성하고있는 액티비티를 새로 띄우는 방법과, 나머지는 액티비티의 일부분을 교체하는 프래그먼트 방식인데요.

먼저 시각적으로는 액티비티를 새로 띄우는경우 화면전체가 슬라이딩 된다던가 하는것을 볼 수 있고, 프래그먼트는 특정부분만 변경되는것을 볼 수 있어요.

우선 한번 안드로이드 스튜디오로 들어가 볼까요?

 

<?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">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:orientation="horizontal">
        <Button
            android:layout_weight="1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="1"
            android:id="@+id/btn1"/>
        <Button
            android:layout_weight="1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="2"
            android:id="@+id/btn2"/>
        <Button
            android:layout_weight="1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="3"
            android:id="@+id/btn3"/>
    </LinearLayout>

    <FrameLayout
        android:id="@+id/view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

activity_main에 이렇게 버튼 3개와 FrameLayout을 생성해줍시다! 하단 FrameLayout이 Fragment가 들어갈 곳이에요!

다음은 layout폴더에 프레그먼트 3개를 생성해 볼까요?

fragment_one.xml

fragment_two.xml

fragment_three.xml

이렇게 세개의 프래그먼트를 생성해 볼까요?

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent" 
        android:text="1"
        android:textSize="60dp"
        android:gravity="center"/>
</android.support.constraint.ConstraintLayout>
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent" 
        android:text="2"
        android:textSize="60dp"
        android:gravity="center"/>
</android.support.constraint.ConstraintLayout>
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent" 
        android:text="3"
        android:textSize="60dp"
        android:gravity="center"/>
</android.support.constraint.ConstraintLayout>

이렇게 3개를 만들어주었습니다!

그리고 

OneFragment.kt

TwoFragment.kt

ThreeFragment.kt

라는 파일도 생성해주세요!

class OneFragment : Fragment() {
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {

        return inflater.inflate(R.layout.fragment_one, container, false)
    }
}
class TwoFragment : Fragment() {
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {

        return inflater.inflate(R.layout.fragment_two, container, false)
    }
}
class ThreeFragment : Fragment() {
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {

        return inflater.inflate(R.layout.fragment_three, container, false)
    }
}

이렇게요! 생성 방법이 Activity와는 다르죠? 

Activity라면 :AppCompatActivity()같은 거였겠지만 Fragment는 :Fragment()방식이랍니다! 

그리고 나서 

MainActivity로 넘어가주세요! 

 supportFragmentManager.beginTransaction()
                    .replace(R.id.view, OneFragment())
                    .commit()

이 소스가 가장 중요해요

FragmentManager를 사용해서 어떤 대상에 대해 추가(beginTransaction)을 해주는것인데요 

FrameLayout의 Id를 view로 주었으니 view를 불러오고, OneFragment()로 추가해주는거에요!

그리고 버튼을 총 3개를 줬었죠?

	btn1.setOnClickListener {
            supportFragmentManager.beginTransaction()
                    .replace(R.id.view, OneFragment())
                    .commit()
        }
        btn2.setOnClickListener {
            supportFragmentManager.beginTransaction()
                    .replace(R.id.view, TwoFragment())
                    .commit()
        }
        btn3.setOnClickListener {
            supportFragmentManager.beginTransaction()
                    .replace(R.id.view, ThreeFragment())
                    .commit()
        }

이렇게 해줍시다!

그리고 한번 실행해 볼까요?

잘 켜지네요?

그럼 버튼을 눌러서 프레그먼트를 불러와 볼까요?

정말로 잘되는군요!!

근데....<activity ... 를 AndroidManifest에 추가하지 않았는데도 에러가 나지 않는게 이상하다구요? 

당연합니다! Fragment는 액티비티로 취급되지 않기 때문입니다!

 

이번시간에 배워본건 Frament입니다! 

뭔가 애매모호 하죠?

그래도 정말 중요한 개념중 하나이니 꼭 집고 넘어가도록 해요!!

다음 차시에 만나요!!