본문 바로가기
Android

[Android] 안드로이드 : 프래그먼트 만들기

by 꿈나무 김땡땡 2019. 12. 12.

1. 프래그먼트란?

  • 한 화면에 여러 부분 화면을 넣는 방식을 쓸 때 사용
    • 레이아웃으로 화면을 쪼개면 다른 화면에 쓸 때 레이아웃/소스코드를 복붙해야 함 > 번거로움
    • 부분적으로 레이아웃 잡아야 하는 부분은 독립적으로 운영

왼쪽 : 스마트폰(작은 화면) // 오른쪽 : 태블릿(큰 화면)

  • 프래그먼트 : 독립적으로 부분 화면을 구성하는 것 . 액티비티를 본따서 만들었음
    • 액티비티 : 하나의 액티비티에서 다른 액티비티로 가려면 액티비티 매니저를 통해서 인텐트를 보내서 전송 (시스템 내)
    • 프래그먼트 : 하나의 프래그먼트에서 다른 프래그먼트로 가려면 프래그먼트 매니저를 통해서 메소드를 보내서 전송

 

  • 프래그먼트를 이용해 화면 전환하기
    • 액티비티 : 시스템에서 관리하므로 리소스 많이 먹음 (무거움)
    • 프래그먼트 : 액티비티는 그대로 두고 화면 전환 하므로 리소스 효율적. 보안 면에서도 안정적

 

  • 프래그먼트를 동작시키기 위해서는 인플레이션 과정 필요

  • 프래그먼트를 만들어서 추가하는 과정


 

  • 프래그먼트의 수명주기

 

2. 프래그먼트 예시

  • 방법1 : activity_main.xml에 <fragment/> 추가하기
  • 방법2 : MainActivity.java에 onClick 메소드로 추가하기

* 예시는 방법2 입니다.

(1) activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:text="메인" />



    <FrameLayout
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/button">

        <!--

        <fragment
            android:id="@+id/mainFragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:name="org.techtown.fragment.MainFragment"/>

            -->


    </FrameLayout>

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_marginStart="23dp"
        android:layout_marginLeft="23dp"
        android:layout_toEndOf="@+id/button"
        android:layout_toRightOf="@+id/button"
        android:text="메뉴" />


</RelativeLayout>

 

(2) MainActivity.java

public class MainActivity extends AppCompatActivity {
    MainFragment fragment1;
    MenuFragment fragment2;

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

        fragment1 = new MainFragment();
        fragment2 = new MenuFragment();

        Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                getSupportFragmentManager().beginTransaction().replace(R.id.container,fragment1).commit();
            }
        });

        Button button2 = (Button) findViewById(R.id.button2);
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                getSupportFragmentManager().beginTransaction().replace(R.id.container,fragment2).commit();
            }
        });
    }


    public void onFragmentChange (int index) {
        if (index == 0) {
            getSupportFragmentManager().beginTransaction().replace(R.id.container, fragment1).commit();
        } else if (index == 1) {
            getSupportFragmentManager().beginTransaction().replace(R.id.container, fragment2).commit();
        }
    }
}

 

(3) fragment_main.xml

  • xml 파일 내 버튼 클릭하면 fragment_menu.xml로 이동
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#FF9800"
    android:orientation="vertical">

    <TextView
        android:id="@+id/textView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="프래그먼트1"
        android:textSize="40sp" />

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="메뉴화면으로" />
</LinearLayout>

 

(4) MainFragment.java

public class MainFragment extends Fragment {

    MainActivity activity;

    // onAttach : activity 위에 올라간다
    // onDetach : activity 위에서 내려온다

    // generate > override methods > onAttach / onDetach

    @Override
    public void onAttach(@NonNull Context context) {
        super.onAttach(context);

        activity = (MainActivity) getActivity();
    }

    @Override
    public void onDetach() {
        super.onDetach();

        activity = null;
    }

    // generate > override methods > onCreateView : xml과 java 연결 (inflation)
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment_main, container, false);

        Button button = (Button) rootView.findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                activity.onFragmentChange(1);
            }
        });

        return rootView;
    }
}

 

(5) fragment_menu.xml

  • xml 파일 내 버튼 클릭하면 fragment_menu.xml로 이동
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#E91E63"
    android:orientation="vertical">

    <TextView
        android:id="@+id/textView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="프래그먼트2"
        android:textSize="40sp" />

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="메인화면으로" />
</LinearLayout>

 

(6) MenuFragment.java

public class MenuFragment extends Fragment {
    MainActivity activity;

    // onAttach : activity 위에 올라간다
    // onDetach : activity 위에서 내려온다

    // generate > override methods > onAttach / onDetach

    @Override
    public void onAttach(@NonNull Context context) {
        super.onAttach(context);

        activity = (MainActivity) getActivity();
    }

    @Override
    public void onDetach() {
        super.onDetach();

        activity = null;
    }

    // generate > override methods > onCreateView : xml과 java 연결 (inflation)
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment_menu, container, false);

        Button button = (Button) rootView.findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                activity.onFragmentChange(0);
            }
        });

        return rootView;
    }
}

 

3. 결과 화면

 

 

댓글