본문 바로가기

Development/Android Studio

(Android Studio) Chapter6. Fragment

1. Fragment 개념

  1) 버튼을 누르면 버튼에 할당된 기능이 나타나도록 하는 기능

  2) 앱 UI의 재사용 가능한 부분을 말함

  3) 자체 레이아웃을 정의하고 자체 수명주기를 가져 자체 입력 이벤트를 처리할 수 있음

  4) 독립적으로 존재할 수 없고 활동이나 다른 프레그먼트에서 호스팅되어야함

  5) 주로 반응형 UI에서 패드 메뉴바를 모바일 환경에서 하단바로 연동할 때 사용하는 기능이기도 함

2. Fragment 최소 수명주기

  1) onCreate

  2) onCreateView

  3) onPause

3. Fragment 구현

  1) Activity_main.xml

    - framelayout 구성 후 linearlayout에 버튼 구성 후 각 버튼에 크기, 무게, 이름, id를 선언

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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/frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    </FrameLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_alignParentBottom="true"
        >
        <Button
            android:id="@+id/btn_1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="메뉴1"/>

        <Button
            android:id="@+id/btn_2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="메뉴2"/>

        <Button
            android:id="@+id/btn_3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="메뉴3"/>

        <Button
            android:id="@+id/btn_4"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="메뉴4"/>

    </LinearLayout>


</RelativeLayout>

  2) fragment 생성

    - fragment를 네 개를 만든다면 java와 layout resource를 각 네 개를 생성

    - fragement를 확장해서 최소 생명주기인 onCreateView를 override

    - onCreateView에 프레그먼트 레이아웃이 삽입됨(fragment0.xml)

    - Inflater 선언, 팽창하고자하는 레이아웃의 ID를 선언하고 하위에 container 매개변수를 담을 ViewGroup, savedInstanceState매개변수를 담은 Bundle도 포함

    - fragment0.java

package com.example.fragmentexample;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;

public class Fragment1 extends Fragment {

    public Fragment1() {

    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment1, container, false);
    
    }
}

    - fragment0.xml

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

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="30sp"
        android:text="Loquens1"/>


</FrameLayout>

 

  3) MainActivity.java 작성

    - 전역변수에 button 선언

    - findViewById로 각 버튼 불러옴

    - FragmentManager로부터 fragmentTransaction 기능을 가져옴

    - 각 버튼에 onClickListener를 통해 클릭하면 선언된 fragmentTransaction을 통해 기존에 담겨있는 fragment를 fragment1로 교체하고 저장( 2)의 savedInstanceState 매개변수를 위해 저장하는 기능)

    - FragmentManager로부터 fragmentTransaction 기능을 가져옴

    - 작성 예시

package com.example.fragmentexample;

import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentTransaction;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

    Button btn1, btn2, btn3, btn4;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btn1 = (Button) findViewById(R.id.btn_1);
        btn2 = (Button) findViewById(R.id.btn_2);
        btn3 = (Button) findViewById(R.id.btn_3);
        btn4 = (Button) findViewById(R.id.btn_4);

        btn1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
                Fragment1 fragment1 = new Fragment1();
                transaction.replace(R.id.frame, fragment1);  // 클릭하면 fragment 교차를 할 건데 fragment1로 교체해
                transaction.commit();  // 교체하면 저장해라

            }
        });

        btn2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
                Fragment2 fragment2 = new Fragment2();
                transaction.replace(R.id.frame, fragment2);  // 클릭하면 fragment 교차를 할 건데 fragment1로 교체해
                transaction.commit();  // 교체하면 저장해라

            }
        });

        btn3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
                Fragment3 fragment3 = new Fragment3();
                transaction.replace(R.id.frame, fragment3);  // 클릭하면 fragment 교차를 할 건데 fragment1로 교체해
                transaction.commit();  // 교체하면 저장해라

            }
        });

        btn4.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
                Fragment4 fragment4 = new Fragment4();
                transaction.replace(R.id.frame, fragment4);  // 클릭하면 fragment 교차를 할 건데 fragment1로 교체해
                transaction.commit();  // 교체하고 저장해라

            }
        });
    }
}

 

3. 참고자료

https://developer.android.com/guide/components/fragments?hl=ko