Yunster's 개인 공부 공간
8. 프래그먼트 살펴보기 본문
1. 프래그먼트 개요
- Fragment는 액티비티 내에 배치되어 사용자 인터페이스를 구성하는 안드로이드 구성요소 중 하나이다.
- 안드로이드 3.0(API 레벨 11) 부터 도입되었다.
- 프래그먼트를 사용하면 한번 만들어둔 UI를 재사용할 수 있다.
- 만약 프래그먼트를 사용하지 않으면 스마트폰용과 태블릿용 액티비티를 따로 개발해야 한다.
- 프래그먼트를 사용하면 따로 만들필요 없이 UI의 위치만 바꾸고 같이 쓸 수 있다.
- 특징
- 프래그먼트는 액티비티 내에만 존재할 수 있다.
- 프래그먼트는 액티비티의 생명주기 내에서 프래그먼트만의 생명주기를 가진다.
- 액티비티가 중지되면 액티비티 내의 프래그먼트는 다시 시작할 수 없다.
- 액티비티가 파기되면 액티비티 내 모든 프래그먼트들은 파기된다.
- 프래그먼트는 필요할 때 생성할 수 있으며, 상태를 저장하고 복원할 수 있다.
- 프래그먼트는 상태와 백스택(BackStack)을 가진다.(백스택 : 뒤로가기 버튼 클릭했을 때 보여줄 이전 프래그먼트들을 저장하고 있는 공간)
- 프래그먼트는 액티비티 내에서 UI 없이도 존재할 수 있다.
- 프래그먼트는 Fragment 클래스를 상속해서 만든 클래스를 말하며, 여러 하위 클래스를 가지고 있다.
- DialogFragment : 다이얼로그를 위한 프래그먼트.
- ListFragment : 리스트를 위한 프래그먼트
- PreferenceFragment : 환경설정을 위한 프래그먼트
- WebViewFragment : 웹뷰를 위한 프래그먼트
2. 프래그먼트 작성
- 프래그먼트 클래스 작성 : 코드 내에 주석으로 설명
public class HelloFragment extends Fragment {
/* 프래그먼트 객체를 반환하는 메소드
프래그먼트는 기본 생성자를 내부적으로 특별한 용도로 사용하기 때문에
newInstance() 메소드를 사용하여 생성하는 것을 권장하고 있다.
*/
public static HelloFragment newInstance() {
HelloFragment f = new HelloFragment();
return f;
}
/* 프래그먼트의 레이아웃을 생성하기 위해 자동으로 호출되는 메소드이다.
프래그먼트에서 사용할 레이아웃을 지정해주면 된다.
inflater : XML로 작성된 레이아웃을 자바에서 사용할 수 있는 객체로 변환해주는 LayoutInflater 객체
container : 프래그먼트를 포함하고 있는 부모 액티비티
savedInstanceState : 재생성되면서 전에 저장된 데이터를 저장하고 있는 Bundle 객체
*/
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
/* inflater에서 inflate 메소드를 호출해서 지정된 fragment_hello.xml 파일을 View 객체로 변환한다.
여기서 container는 부모 뷰이고, false는 지정된 container에 추가할 지를 결정하는 값이다.
*/
View layout = inflater.inflate(R.layout.fragment_hello, container, false);
return layout;
}
/* OnCreateView() 다음에 호출되는 메소드
onCreateView() 메소드에서 생성한 뷰와 이전 프래그먼트의 데이터가 저장된 Bundle 객체를 매개변수로 전달받는다.
view 매개변수를 이용하면 onCreateView() 메소드에서 지정한 R.layout.fragment_hello 레이아웃 파일의 위젯에
view.FindById()를 사용하여 접근할 수 있다.
*/
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
setView(view);
}
/* setView() 메소드는 책 저자가 직접 만든 메소드이다.
뷰를 가지고 위젯을 찾거자 데이터를 설정하는 작업을 하기 위해 작성했다.
*/
private void setView(View view) {
TextView titleText = view.findViewById(R.id.title);
titleText.setText("안녕하세요!");
}
}
3. 프래그먼트 추가 방법
- 액티비티에 프래그먼트를 추가하는 방법은 두 가지가 있다.
1) 레이아웃 파일에서 프래그먼트를 추가하는 방법
2) 자바 코드에서 프래그먼트를 추가하는 방법 : 한 개의 액티비티에서 여러 프래그먼트를 다루는 경우 적합
3-1) 레이아웃 파일에서 프래그먼트를 추가하는 방법
- 액티비티 레이아웃 xml 파일에 프래그먼트를 추가하기 위해서는 <fragment> 태그를 사용해야 한다.
- 위젯을 배치하는 것처럼 위치할 곳에 <fragment> 태그로 배치하면 된다.
- 아래는 레이아웃 xml 코드 예제이다.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<fragment
android:id="@+id/fragment"
android:name="com.example.firstapp.HelloFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
3-2) 자바 코드에서 프래그먼트를 추가하는 방법
- 프래그먼트는 자바 코드에서도 추가할 수 있다.
- 다음은 RelativeLayout을 사용해 프레임 레이아웃을 하단에 배치한 자바 코드이다. 프레임 레이아웃에는 프래그먼트가 배치된다.
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fragment_java);
setView();
}
private void setView() {
/* 프래그먼트를 배치할 수 있는 FragmentTransaction 객체를 생성하기 위해,
getFragmentManager() 메소드로 FragmentManager를 얻은 후에 beginTransaction() 메소드 호출
*/
FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
/* replace()는 프래그먼트를 레이아웃의 위젯에 배치하는 기능을 수행한다.
R.id.bottom인 위젯 영역에 HelloFragment.newInstance()로 생성한 프래그먼트가 배치된다.
replace: 프래그먼트 교체, add: 프래그먼트 추가.
다 하고 commit() 메소드를 호출해야 작업 내용이 반영된다.
*/
ft.replace(R.id.bottom, HelloFragment.newInstance());
ft.commit();
}
}
※ 위 코드에서 FragmentManager, FragmentTransaction, 그리고 HelloFragment.java에서 Fragment는 전부 android.app.XXX 이렇게 import 해야한다. 그냥 자동완성 했다간 android.support.v4.app.XXX 이렇게 import 될 경우도 있는데, 그러면 오류가 발생한다.
4. 프래그먼트 생명주기
- 액티비티처럼 프래그먼트도 생명주기를 가지고 있다.
- 아래 그림은 액티비티 생명주기와 프래그먼트 생명주기를 함께 보여준다. 이렇게 봐야 하는 이유는 프래그먼트는 액티비티가 없이는 존재할 수가 없기 때문이다.
- 프래그먼트 생명주기 메소드
onAttach(Activity activity) |
API 23부터 사용 중단 되었으므로 onAttach(Context) 사용해야 한다. |
onAttach(Context context) |
프래그먼트를 컨텍스트(context)인 액티비티에 연결할 때 호출된다. |
onCreate(Bundle savedInstanceState) |
프래그먼트를 생성할 때 호출된다. |
onCreateView(LayoutInflater, ViewGroup, Bundle) |
프래그먼트의 뷰를 생성할 때 호출된다. |
onActivityCreated(Bundle) |
프래그먼트와 연결된 액티비티가 생성되었을 때 호출된다. |
onStart() |
프래그먼트를 사용자에게 보여줄 때 호출된다. |
onResume() |
프래그먼트를 사용자에게 보여주고 사용자가 사용할 수 있을 때 호출된다. |
onPause() |
액티비티가 더 이상 보여지지 않을 때 호출된다. |
onStop() |
액티비티가 더 이상 시작할 수 없을 때 호출된다. |
onDestroyView() |
onCreateView()로 생성한 프래그먼트의 뷰를 파기해야 할 때 호출된다. |
onDestroy() |
프래그먼트가 더 이상 사용되지 않을 때 호출된다. |
onDetach() |
프래그먼트가 더 이상 액티비티와 연결되지 않을 때 호출된다. |
[출처] 한동호, '나의 첫 안드로이드 : 처음 시작하는 개발자를 위한', 한빛미디어, 2018
'안드로이드-나의 첫 안드로이드' 카테고리의 다른 글
10-1. 인텐트(Intent)의 이해 (0) | 2019.03.20 |
---|---|
9. 알림 기능 살펴보기 (0) | 2019.03.19 |
7. 안드로이드 뷰 컨테이너 살펴보기 (0) | 2019.03.14 |
6. 안드로이드 레이아웃 살펴보기 (0) | 2019.03.12 |
5. 안드로이드 기본 위젯 살펴보기 (0) | 2019.03.07 |