Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
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
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

Yunster's 개인 공부 공간

8. 프래그먼트 살펴보기 본문

안드로이드-나의 첫 안드로이드

8. 프래그먼트 살펴보기

yunster 2019. 3. 18. 16:49

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

Comments