알면 알수록 더 복잡한 프래그먼트 정리해봅니다.
간단한 내용만 담아 내용이 부족할 수 있어 참고하기 좋은 블로그도 같이 봐주세요.
■프래그먼트란?
Fragment란 영어로 조각을 의미하며, 앱 UI의 재사용 가능한 부분을 나타낸다.
Fragment는 액티비티 내에서 화면의 일부를 나타내며, 여러개의 Fragment를 조합하여 액티비티 화면 UI를 표현할 수 있다 . 또한 하나의 Fragment 를 다른 액티비티에 재사용할 수 있다.
프래그먼트는 자체 레이아웃을 정의 및 관리하고 자체 수명 주기를 보유하며 자체 입력 이벤트를 처리할 수 있다.
프래그먼트는 독립적으로 존재할 수 없어서 항상 액티비티 내에서 호스팅되어야 하며 해당 프래그먼트의 수명 주기는 호스트 액티비티의 수명 주기에 직접적으로 영향을 받습니다. 예를 들어 액티비티가 일시정지되는 경우, 그 안의 모든 프래그먼트도 일시정지되며 액티비티가 소멸되면 모든 프래그먼트도 마찬가지로 소멸됩니다.
■프래그먼트 사용법
1.activity_main.xml 에 Fragment 추가
2. 각각의 Fragment를 위한 Layout 리소스 xml 작성
3. 각각의 Fragment 자바 클래스 구현 (Fragment 를 상속 받는 클래스)
4. MainActivity의 onCreate()에서 Fragment 초기화 및 제어
1. activity_main.xml 에 Fragment 추가
<FrameLayout>은 Fragment를 담을 레이아웃 컨테이너로,이 안에 프래그먼트가 화면에 띄워질 수 있다.
<FrameLayout>은 <FrameLayout >안에 여러화면을 겹쳐 넣을 수 있게 하는 레이아웃이다.
"
좀 더 쉽게 비유해서 말하면 Frame은 한국말로 액자(틀)인데 액자라는 틀이 있으면 그 액자에 사진을 한장만 넣을 수 도 있지만 사진을 여러개 중첩해서 스택구조로 끼워넣어 볼수도 있을 것이다. 그리그 맨위의 사진이 사라지면 그 밑에 깔려있는 사진이 보여지게되고 그럴 것이다. 이렇게 액자를 비유로 들면 쉽게 이해가 간다. 액자=프레임레이아웃, 프래그먼트 = 사진
"
출처: https://youngest-programming.tistory.com/3
-activity_main.xml
각각의 버튼 위젯을 클릭 시 각각의 Fragment를 띄우도록 구현
<?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/btn1"
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:layout_weight = "1"
android:text = "메뉴1"
></Button>
<Button
android:id="@+id/btn2"
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:layout_weight = "1"
android:text = "메뉴2"
></Button>
<Button
android:id="@+id/btn3"
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:layout_weight = "1"
android:text = "메뉴3"
></Button>
<Button
android:id="@+id/btn4"
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:layout_weight = "1"
android:text = "메뉴4"
></Button>
</LinearLayout>
</RelativeLayout>
2. 각각의 Fragment를 위한 Layout 리소스 xml 작성
메인 액티비티의 FrameLayout에 띄워질 각각의 Fragment
- fragment1.xml (간단한 사용법을 이해하기 위해 각 리소스 xml의 <android:text>만 다르게 작성)
<?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:layout_gravity ="center"
android:textSize = "30dp"
android:text = "프래그먼트1"
></TextView>
</FrameLayout>
3. 각각의 Fragment 자바 클래스 구현 (Fragment 를 상속 받는 클래스)
-Fragment1.java (각각 Fragment 클래스에서 연두색부분 만 각각 수정하여 작성해준다)
package com.androidpark.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);
}
}
✔return inflater.inflate(R.layout.fragment1, container, false);
=> fragment1 을 인플레이트해주고 컨테이너에 붙여달라는 뜻이다.
4. MainActivity의 onCreate()에서 Fragment 초기화 및 제어
package com.androidpark.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 = findViewById(R.id.btn1);
btn2 = findViewById(R.id.btn2);
btn3 = findViewById(R.id.btn3);
btn4 = findViewById(R.id.btn4);
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);
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);
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);
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);
transaction.commit();
}
});
}
}
Java 코드에서 Fragment를 다룰 때 FragmentManager와 FragmentTransaction 클래스를 사용한다.
각각 사용하기 위해서는
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
Fragment1 fragment1 = new Fragment1(); // Fragment 초기화
transaction.replace(R.id.frame,fragment1); // frame 컨테이너에 fragment1로 교체하겠다.
transaction.commit(); // Fragment와 관련된 작업이 완료되었음
✔FragmentManager => Activity 클래스의 getSupportFragmentManager() 함수를 사용하여FragmentManager에 대한 참조를 획득한다.
✔ FragmentTransaction => FragmentManager의 beginTransaction() 함수를 호출하여 FragmentTransaction을 시작
✔ add 또는 replace = > 첫번째 파라미터(container)에 두번째 파라미터를 추가 또는 교체해준다는 뜻
■프래그먼트 참고
소스코드 참고
https://duckssi.tistory.com/13
프래그먼트 사용법 참고
https://developer.android.com/guide/fragments/create
https://recipes4dev.tistory.com/58
프래그먼트에 대해서 간단하게 정리해보았다.
프래그먼트를 활용할 수 있는 방안이 많아서 천천히 정리해보려고 한다.
'Adroid Studio' 카테고리의 다른 글
Android Studio_안드로이드 스튜디오_4대컴포넌트_서비스, 브로드캐스트 리시버,콘텐트 프로바이더 (0) | 2022.09.06 |
---|---|
Android Studio_안드로이드 스튜디오 앱 만들기6_SQLite의 기본 (0) | 2022.09.01 |
Android Studio_안드로이드 스튜디오_4대컴포넌트_액티비티-2 (2) | 2022.08.29 |
Android Studio_안드로이드 스튜디오_4대컴포넌트_액티비티-1 (0) | 2022.08.26 |
Android Studio_옵션메뉴와 컨택스트 메뉴 차이 (0) | 2022.08.26 |