프래그먼트란
액티비티 내에 배치되어 사용자 인터페이스를 구성하는 안드로이드 구성요소 중 하나입니다.
이 개념이 나온 이유는 안드로이드가 여러 디바이스 (예 : 태블릿) 을 지원하면서 다양한 기기의 화면에 대응할 필요가 있어졌기 때문입니다.
액티비티 내의 일부 영역을 차지하여 사용하 화면을 구성할 수 있으며,
액티비티 내에서 독립적으로 동작할 수 있어서, 한 번 만들어 두면 다른 액티비티에서도 사용할 수 있습니다.
아래 공식 안드로이드 개발 URL 에서 프래그먼트를 자세하게 다루고 있습니다.
https://developer.android.com/guide/components/fragments?hl=ko
프래그먼트의 특징
1. 액티비티 내에만 존재할 수 있습니다.
2. 액티비티의 생명주기 내에서 프래그먼트만의 생명주기를 가집니다.
3. 액티비티가 중지되면 액티비티 내의 프래그먼트는 다시 시작할 수 없습니다.
4. 액티비티가 파괴되면 액티비티 내의 프래그먼트들은 모두 파기됩니다.
5. 프래그먼트는 필요할 때 생성할 수 있으며 상태를 저장하고 복원할 수 있습니다.
6. 프래그먼트는 상태와 백스택(BackStack) 을 가집니다.
7. 프래그먼트는 액티비티 내에서 UI 없이도 존재할 수 있습니다.
* 백스택이란 액티비티가 열린 순서대로 쌓인 스택을 다시 되돌아 가는 것을 의미합니다.
액티비티와 프래그먼트의 관계
프래그먼트는 액티비티 내에서 동작하는 안드로이드 구성요소이기 때문에 액티비티 없이는 존재할 수 없습니다.
아래 사진을 보면 태블릿에서는 액티비티 A에 프래그먼트 A, B 2개로 구성이 되어 있습니다.
그렇지만 스마트폰으로는 액티비티 A 에서 프래그먼트 A 를, 액티비티 B 에서 프래그먼트 B 를 보여줄 수 있습니다.
이렇게 프래그먼트는 액티비티와 독립적으로 동작하기 때문에, 하나의 액티비티에 한개만 혹은 여러개의 프래그먼트를 배치할 수 있습니다.
물론 내부적으로 기기마다 구분하는 코드가 필요하긴 합니다.
프래그먼트의 생명주기
위에서 말한것처럼 프래그먼트도 생명주기를 가지고 있습니다.
프래그먼트를 다루기 위해서는 각 생명주기마다 호출되는 메소드를 알아야 합니다.
이유는 안드로이드 시스템이 생명주기에 따라 아래 작성된 메소드를 자동으로 호출하기 때문입니다.
액티비티에 프래그먼트 보이게 하는 방법
프래그먼트 작성과 추가 단계를 거쳐 액티비티에 등록할 수 있습니다.
프래그먼트 작성
액티비티처럼 클래스와 레이아웃을 작성해야 합니다.
프래그먼트는 Fragment 클래스를 상속해서 만들어야 하고, 레이아웃은 XML 처럼 위젯을 배치합니다.
FragementActivity JAVA 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
package com.example.fragmentactivity;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class FragmentActivity extends Fragment {
public static FragmentActivity newInstance() {
FragmentActivity f = new FragmentActivity();
return f;
}
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View layout = inflater.inflate(R.layout.fragement_layout, container, false);
return layout;
}
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
}
}
|
cs |
fragment_layout XML 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:textSize="20sp"
android:textStyle="bold"
android:text="HELLO"/>
</LinearLayout>
|
cs |
프래그먼트 추가
액티비티에 프래그먼트를 추가합니다.
추가하는 방법은 액티비티 레이아웃에서 프래그먼트를 등록하는 방법과 액티비티 코드에서 등록하는 방법이 있습니다.
액티비티 레이아웃에서 등록하는 방법
activity_main XML 코드 에 frament 액티비티를 등록해 줍니다.
이렇게 설정해 주면 fragment 액티비티에 등록된 프래그먼트 레이아웃을 보여줍니다.
activity_main XML 에서는 이 fragment 의 크기를 조정하여 원하는 위치, 크기만큼만 설정할 수 있습니다.
XML 에서 프래그먼트를 설정해 주었기 때문에, 자바 코드에서는 추가작업을 하지 않아도 괜찮습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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">
<fragment class="com.example.fragmentactivity.FragmentActivity"
android:id="@+id/fragment"
android:layout_height="match_parent"
android:layout_width="match_parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>
|
cs |
액티비티 코드에서 등록하는 방법
액티비티 XML 에 프래그먼트를 설정하지 않고 코드에 등록하는 방법입니다.
이번에는 액티비티 특정영역에 위젯을 배치한 후, 해당 위젯에 프래그먼트를 매핑하는 방식입니다.
JAVA 코드
액티비티 XML 의 bottom 영역을 FragmentActivity 의 레이아웃으로 대체하는 코드입니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
package com.example.fragmentactivity;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.bottom, FragmentActivity.newInstance());
ft.commit();
}
}
|
cs |
XML
FrameLayout 으로 bottom ID 에 일정영역을 잡았습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
<?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"
android:orientation="vertical"
tools:context=".MainActivity">
<FrameLayout
android:id="@+id/bottom"
android:layout_width="match_parent"
android:layout_height="200dp"
android:layout_alignParentBottom="true"/>
</RelativeLayout>
|
cs |
'Computer Language > Android' 카테고리의 다른 글
[Android] 안드로이드 Unable to start activity ComponentInfo: android.os.NetworkOnMainThreadException 임시 해결하기 (0) | 2021.07.25 |
---|---|
[Android] 안드로이드 Network error IOException: socket failed: EACCES (Permission denied) 해결하기 (0) | 2021.07.25 |
[Android] 안드로이드 match_parent 와 wrap_content 차이점 (0) | 2021.07.12 |
[Android] 안드로이드 레이아웃 (0) | 2021.07.12 |
[Android] 안드로이드 인텐트 다른 액티비티로 이동 및 데이터를 전달 (0) | 2021.07.10 |